From 6673bf0b18b28a498c13fba08cd7a00faa767140 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Mon, 20 Mar 2023 17:43:36 +0800
Subject: [PATCH 01/92] feat(test): update TEST_ID
---
src/common/enums/test.ts | 4 ++++
src/components/Comment/Feed/index.tsx | 6 +++++-
src/components/UserDigest/Mini/index.tsx | 14 ++++++++++++--
src/components/UserProfile/index.tsx | 7 ++++++-
tests/helpers/poms/userProfile.ts | 2 ++
5 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/common/enums/test.ts b/src/common/enums/test.ts
index 3bdb5ab350..b840be1f91 100644
--- a/src/common/enums/test.ts
+++ b/src/common/enums/test.ts
@@ -8,6 +8,8 @@ export enum TEST_ID {
DIGEST_ARTICLE_SIDEBAR = 'digest/article/sidebar',
DIGEST_ARTICLE_TITLE = 'digest/article/title',
DIGEST_USER_MINI = 'digest/user/mini',
+ DIGEST_USER_MINI_DISPLAY_NAME = 'digest/user/mini/display-name',
+ DIGEST_USER_MINI_USER_NAME = 'digest/user/mini/user-name',
DIGEST_USER_PLAIN = 'digest/user/plain',
DIGEST_USER_RICH = 'digest/user/rich',
DIGEST_USER_RICH_DISPLAY_NAME = 'digest/user/rich/display-name',
@@ -32,6 +34,7 @@ export enum TEST_ID {
ARTICLE_APPRECIATION_TOTAL = 'article/appreciation/total',
ARTICLE_TOOLBAR = 'article/toolbar',
ARTICLE_BOOKMARK = 'article/bookmark',
+ ARTICLE_COMMENT_FEED = 'article/comment/feed',
// payto
PAY_TO_CURRENCY_CHOICE = 'payto/currency-choice',
// comment
@@ -77,6 +80,7 @@ export enum TEST_ID {
// user profile
USER_PROFILE = 'user-profile',
USER_PROFILE_DISPLAY_NAME = 'user-profile/display-name',
+ USER_PROFILE_USER_NAME = 'user-profile/user-name',
USER_PROFILE_FOLLOWERS_COUNT = 'user-profile/followers/count',
USER_PROFILE_BIO = 'user-profile/bio',
diff --git a/src/components/Comment/Feed/index.tsx b/src/components/Comment/Feed/index.tsx
index d4ad41428d..dfaee93f62 100644
--- a/src/components/Comment/Feed/index.tsx
+++ b/src/components/Comment/Feed/index.tsx
@@ -1,6 +1,7 @@
import { useLazyQuery } from '@apollo/react-hooks'
import React from 'react'
+import { TEST_ID } from '@/src/common/enums'
import { AvatarSize, CommentFormType, UserDigest } from '~/components'
import {
FeedCommentPrivateFragment,
@@ -52,7 +53,10 @@ export const BaseCommentFeed = ({
}
return (
-
+
{hasDisplayName && (
- {user.displayName}
+
+ {user.displayName}
+
)}
{hasUserName && user.userName && (
- @{user.userName}
+
+ @{user.userName}
+
)}
diff --git a/src/components/UserProfile/index.tsx b/src/components/UserProfile/index.tsx
index eff790368f..d00b092dd6 100644
--- a/src/components/UserProfile/index.tsx
+++ b/src/components/UserProfile/index.tsx
@@ -260,7 +260,12 @@ export const UserProfile = () => {
- @{user.userName}
+
+ @{user.userName}
+
{!isMe && }
diff --git a/tests/helpers/poms/userProfile.ts b/tests/helpers/poms/userProfile.ts
index 8fecf11765..dec661005c 100644
--- a/tests/helpers/poms/userProfile.ts
+++ b/tests/helpers/poms/userProfile.ts
@@ -16,6 +16,7 @@ export class UserProfilePage {
// profile
displayName: Locator
+ userName: Locator
bio: Locator
// followButton: Locator
// rssButton: Locator
@@ -48,6 +49,7 @@ export class UserProfilePage {
// profile
this.displayName = page.getByTestId(TEST_ID.USER_PROFILE_DISPLAY_NAME)
+ this.userName = page.getByTestId(TEST_ID.USER_PROFILE_USER_NAME)
this.bio = page.getByTestId(TEST_ID.USER_PROFILE_BIO)
// feeds
From 8959180c812e1c33884f2c082baf9e8d130081ef Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Mon, 20 Mar 2023 17:45:26 +0800
Subject: [PATCH 02/92] feat(test): add switchBetweenMultiUser
---
tests/switchBetweenMultiUser.spec.ts | 125 +++++++++++++++++++++++++++
1 file changed, 125 insertions(+)
create mode 100644 tests/switchBetweenMultiUser.spec.ts
diff --git a/tests/switchBetweenMultiUser.spec.ts b/tests/switchBetweenMultiUser.spec.ts
new file mode 100644
index 0000000000..84e607cfd0
--- /dev/null
+++ b/tests/switchBetweenMultiUser.spec.ts
@@ -0,0 +1,125 @@
+import { expect, test } from '@playwright/test'
+
+import { TEST_ID } from '~/common/enums'
+
+import {
+ ArticleDetailPage,
+ authedTest,
+ login,
+ logout,
+ pageGoto,
+ UserProfilePage,
+ users,
+} from './helpers'
+
+test.describe('Switch between multiple users', () => {
+ authedTest('Same context', async ({ alicePage: page, isMobile }) => {
+ await pageGoto(page, '/')
+ const firstArticleLink = (await page
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_FEED)
+ .first()
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .getAttribute('href')) as string
+
+ expect(firstArticleLink).toBeTruthy()
+
+ await pageGoto(page, firstArticleLink)
+
+ // [Alice] Logout
+ await logout({ page })
+
+ // [Bob] Login
+ await login({
+ email: users.bob.email,
+ password: users.bob.password,
+ page,
+ target: firstArticleLink,
+ })
+
+ const articleDetail = new ArticleDetailPage(page, isMobile)
+ // [Bob] Send a comment
+ await articleDetail.sendComment()
+
+ // [Bob] Get display name and user name in first comment
+ const firstComment = await page
+ .getByTestId(TEST_ID.ARTICLE_COMMENT_FEED)
+ .first()
+ const displayName = await firstComment
+ .getByTestId(TEST_ID.DIGEST_USER_MINI_DISPLAY_NAME)
+ .first()
+ .innerText()
+ const userName = await firstComment
+ .getByTestId(TEST_ID.DIGEST_USER_MINI_USER_NAME)
+ .first()
+ .innerText()
+
+ // [Bob] Get display name and user name
+ const bobProfile = new UserProfilePage(page, isMobile)
+ await bobProfile.gotoMeProfile()
+ const profileDisplayName = await bobProfile.displayName.innerText()
+ const profileUserName = await bobProfile.userName.innerText()
+
+ expect(displayName).toBe(profileDisplayName)
+ expect(userName).toBe(profileUserName)
+ })
+
+ test('Different Context', async ({ browser, isMobile }) => {
+ const aliceContext = await browser.newContext()
+ const bobContext = await browser.newContext()
+
+ const alicePage = await aliceContext.newPage()
+ const bobPage = await bobContext.newPage()
+
+ await pageGoto(alicePage, '/')
+ const firstArticleLink = (await alicePage
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_FEED)
+ .first()
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .getAttribute('href')) as string
+
+ // [Alice] login
+ await login({
+ email: users.alice.email,
+ password: users.alice.password,
+ page: alicePage,
+ target: firstArticleLink,
+ })
+
+ // [Alice] Logout
+ await logout({ page: alicePage })
+
+ // [Bob] login
+ await login({
+ email: users.bob.email,
+ password: users.bob.password,
+ page: bobPage,
+ target: firstArticleLink,
+ })
+
+ const articleDetail = new ArticleDetailPage(bobPage, isMobile)
+ // [Bob] Send a comment
+ await articleDetail.sendComment()
+
+ // [Bob] Get display name and user name in first comment
+ const firstComment = await bobPage
+ .getByTestId(TEST_ID.ARTICLE_COMMENT_FEED)
+ .first()
+ const displayName = await firstComment
+ .getByTestId(TEST_ID.DIGEST_USER_MINI_DISPLAY_NAME)
+ .first()
+ .innerText()
+ const userName = await firstComment
+ .getByTestId(TEST_ID.DIGEST_USER_MINI_USER_NAME)
+ .first()
+ .innerText()
+
+ // [Bob] Get display name and user name
+ const bobProfile = new UserProfilePage(bobPage, isMobile)
+ await bobProfile.gotoMeProfile()
+ const profileDisplayName = await bobProfile.displayName.innerText()
+ const profileUserName = await bobProfile.userName.innerText()
+
+ expect(displayName).toBe(profileDisplayName)
+ expect(userName).toBe(profileUserName)
+ })
+})
From 6bba45534766833d74298ce1253e75d573fcea69 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Mon, 20 Mar 2023 19:22:43 +0800
Subject: [PATCH 03/92] feat(test): switchBetweenMultiUser only run desktop
---
tests/switchBetweenMultiUser.spec.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tests/switchBetweenMultiUser.spec.ts b/tests/switchBetweenMultiUser.spec.ts
index 84e607cfd0..59ac8b3e16 100644
--- a/tests/switchBetweenMultiUser.spec.ts
+++ b/tests/switchBetweenMultiUser.spec.ts
@@ -14,6 +14,7 @@ import {
test.describe('Switch between multiple users', () => {
authedTest('Same context', async ({ alicePage: page, isMobile }) => {
+ test.skip(!!isMobile, 'Desktop only!')
await pageGoto(page, '/')
const firstArticleLink = (await page
.getByTestId(TEST_ID.DIGEST_ARTICLE_FEED)
@@ -64,6 +65,7 @@ test.describe('Switch between multiple users', () => {
})
test('Different Context', async ({ browser, isMobile }) => {
+ test.skip(!!isMobile, 'Desktop only!')
const aliceContext = await browser.newContext()
const bobContext = await browser.newContext()
From 134d4a7ae1c2e0d77e48775999a299b8f9169db5 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Tue, 21 Mar 2023 15:45:58 +0800
Subject: [PATCH 04/92] feat(test): update switchBetweenMultiUser
feat(test): update switchBetweenMultiUser
---
tests/switchBetweenMultiUser.spec.ts | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/tests/switchBetweenMultiUser.spec.ts b/tests/switchBetweenMultiUser.spec.ts
index 59ac8b3e16..d292628e7a 100644
--- a/tests/switchBetweenMultiUser.spec.ts
+++ b/tests/switchBetweenMultiUser.spec.ts
@@ -1,5 +1,6 @@
import { expect, test } from '@playwright/test'
+import { sleep } from '@/src/common/utils/time'
import { TEST_ID } from '~/common/enums'
import {
@@ -26,6 +27,7 @@ test.describe('Switch between multiple users', () => {
await pageGoto(page, firstArticleLink)
+ await sleep(3 * 1000)
// [Alice] Logout
await logout({ page })
@@ -36,9 +38,11 @@ test.describe('Switch between multiple users', () => {
page,
target: firstArticleLink,
})
+ await page.waitForLoadState('networkidle')
const articleDetail = new ArticleDetailPage(page, isMobile)
// [Bob] Send a comment
+ await sleep(3 * 1000)
await articleDetail.sendComment()
// [Bob] Get display name and user name in first comment
@@ -87,6 +91,7 @@ test.describe('Switch between multiple users', () => {
target: firstArticleLink,
})
+ await sleep(3 * 1000)
// [Alice] Logout
await logout({ page: alicePage })
@@ -97,9 +102,11 @@ test.describe('Switch between multiple users', () => {
page: bobPage,
target: firstArticleLink,
})
+ await bobPage.waitForLoadState('networkidle')
const articleDetail = new ArticleDetailPage(bobPage, isMobile)
// [Bob] Send a comment
+ await sleep(3 * 1000)
await articleDetail.sendComment()
// [Bob] Get display name and user name in first comment
From 94925a0aae4d50265cda17c497d11e2c9b30f025 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:08:46 +0800
Subject: [PATCH 05/92] feat(Forms): add
feat(test): update switchBetweenMultiUser
---
.../Forms/EditorSearchSelectForm/index.tsx | 176 ++++++++++++++++++
.../Forms/EditorSearchSelectForm/styles.css | 12 ++
2 files changed, 188 insertions(+)
create mode 100644 src/components/Forms/EditorSearchSelectForm/index.tsx
create mode 100644 src/components/Forms/EditorSearchSelectForm/styles.css
diff --git a/src/components/Forms/EditorSearchSelectForm/index.tsx b/src/components/Forms/EditorSearchSelectForm/index.tsx
new file mode 100644
index 0000000000..2d496856ca
--- /dev/null
+++ b/src/components/Forms/EditorSearchSelectForm/index.tsx
@@ -0,0 +1,176 @@
+import { useEffect, useState } from 'react'
+
+import { MAX_ARTICLE_TAG_LENGTH, TextId } from '~/common/enums'
+import { Button, Dialog, IconAdd16, TextIcon, Translate } from '~/components'
+import SearchingArea, {
+ SearchType,
+ SelectNode,
+} from '~/components/SearchSelect/SearchingArea'
+import StagingArea, {
+ CustomStagingAreaProps,
+ StagingNode,
+} from '~/components/SearchSelect/StagingArea'
+import { SearchExclude, SearchFilter } from '~/gql/graphql'
+
+import styles from './styles.css'
+
+/**
+ * is a dialog content for
+ * searching nodes (article, tag, and user),
+ * select and submit them to the component used it.
+ *
+ * It composed of three main components:
+ *
+ * - : typing keyword for searching nodes.
+ *
+ * - : showing the above search results,
+ * click node will add it to the staging area.
+ *
+ * - : managing staging nodes, selected nodes will be submitted.
+ *
+ */
+type Area = 'staging' | 'searching'
+
+export type SearchSelectNode = SelectNode
+
+export type EditorSearchSelectFormProps = {
+ title: TextId | React.ReactNode
+ hint: TextId
+ headerLeftButton?: React.ReactNode
+ headerRightButtonText?: string | React.ReactNode
+ closeDialog: () => void
+
+ nodes?: SelectNode[]
+ onSave: (nodes: SelectNode[]) => Promise
+ saving?: boolean
+
+ searchType: SearchType
+ searchFilter?: SearchFilter
+ searchExclude?: SearchExclude
+
+ draggable?: boolean
+
+ createTag?: boolean
+ inviteEmail?: boolean
+
+ CustomStagingArea?: (props: CustomStagingAreaProps) => JSX.Element
+}
+
+const EditorSearchSelectForm = ({
+ title,
+ hint,
+ CustomStagingArea,
+ headerLeftButton,
+ headerRightButtonText,
+ closeDialog,
+
+ nodes,
+ onSave,
+ saving,
+
+ searchType,
+ searchFilter,
+ searchExclude,
+
+ draggable,
+
+ createTag,
+ inviteEmail,
+}: EditorSearchSelectFormProps) => {
+ const initStagingNodes =
+ nodes?.map((node) => ({ node, selected: true })) || []
+
+ // area
+ const [area, setArea] = useState('staging')
+ const inStagingArea = area === 'staging'
+ const inSearchingArea = area === 'searching'
+ const toStagingArea = () => setArea('staging')
+ const toSearchingArea = () => setArea('searching')
+
+ useEffect(() => {
+ setArea('staging')
+ setStagingNodes(initStagingNodes)
+ }, [])
+
+ // data
+ const [stagingNodes, setStagingNodes] =
+ useState(initStagingNodes)
+ const addNodeToStaging = (node: SelectNode) => {
+ setStagingNodes([
+ ...stagingNodes.filter(({ node: n }) => n.id !== node.id),
+ { node, selected: true },
+ ])
+
+ toStagingArea()
+ }
+
+ const enableAdd = stagingNodes.length < MAX_ARTICLE_TAG_LENGTH
+
+ const onClickSave = async () => {
+ await onSave(
+ stagingNodes.filter(({ selected }) => !!selected).map(({ node }) => node)
+ )
+ }
+
+ return (
+ <>
+ }
+ loading={saving}
+ />
+ }
+ />
+
+ {inStagingArea && (
+
+
+ ({stagingNodes.length}/3)
+
+ )}
+
+ {inSearchingArea && (
+
+ )}
+ {inStagingArea && (
+
+ )}
+
+ >
+ )
+}
+
+export default EditorSearchSelectForm
diff --git a/src/components/Forms/EditorSearchSelectForm/styles.css b/src/components/Forms/EditorSearchSelectForm/styles.css
new file mode 100644
index 0000000000..355581b5af
--- /dev/null
+++ b/src/components/Forms/EditorSearchSelectForm/styles.css
@@ -0,0 +1,12 @@
+.stagingHeadArea {
+ @mixin flex-center-start;
+ @mixin border-bottom-grey;
+
+ padding: var(--spacing-base);
+
+ & .number {
+ font-size: var(--font-size-md-s);
+ line-height: 1.4;
+ color: var(--color-grey);
+ }
+}
From d10787e3446241aef240f2b3a669ba22ed702342 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:10:39 +0800
Subject: [PATCH 06/92] feat(Dialogs): add
---
.../EditorSearchSelectDialog/index.tsx | 50 +++++++++++++++++++
src/components/Dialogs/index.tsx | 3 ++
src/components/Editor/Sidebar/Tags/index.tsx | 6 +--
3 files changed, 56 insertions(+), 3 deletions(-)
create mode 100644 src/components/Dialogs/EditorSearchSelectDialog/index.tsx
diff --git a/src/components/Dialogs/EditorSearchSelectDialog/index.tsx b/src/components/Dialogs/EditorSearchSelectDialog/index.tsx
new file mode 100644
index 0000000000..a122a66632
--- /dev/null
+++ b/src/components/Dialogs/EditorSearchSelectDialog/index.tsx
@@ -0,0 +1,50 @@
+import dynamic from 'next/dynamic'
+
+import { Dialog, DialogProps, Spinner, useDialogSwitch } from '~/components'
+import { EditorSearchSelectFormProps } from '~/components/Forms/EditorSearchSelectForm'
+import { SelectNode } from '~/components/SearchSelect/SearchingArea'
+
+type EditorSearchSelectDialogProps = Omit<
+ EditorSearchSelectFormProps,
+ 'closeDialog'
+> & {
+ children: ({ openDialog }: { openDialog: () => void }) => React.ReactNode
+} & Pick
+
+const DynamicEditorSearchSelectForm = dynamic(
+ () => import('~/components/Forms/EditorSearchSelectForm'),
+ { loading: Spinner }
+)
+
+const BaseSearchSelectDialog = ({
+ children,
+ size,
+ ...props
+}: EditorSearchSelectDialogProps) => {
+ const { show, openDialog, closeDialog } = useDialogSwitch(true)
+
+ return (
+ <>
+ {children({ openDialog })}
+
+
+ >
+ )
+}
+
+export const EditorSearchSelectDialog = (
+ props: EditorSearchSelectDialogProps
+) => (
+ }>
+ {({ openDialog }) => <>{props.children({ openDialog })}>}
+
+)
diff --git a/src/components/Dialogs/index.tsx b/src/components/Dialogs/index.tsx
index 8dd4dae0d0..6b1172d13a 100644
--- a/src/components/Dialogs/index.tsx
+++ b/src/components/Dialogs/index.tsx
@@ -13,6 +13,9 @@ export * from './ReviseArticleDialog'
export * from './ShareDialog'
export * from './SupportersDialog'
+// Editor
+export * from './EditorSearchSelectDialog'
+
// Tag
export * from './RecommendTagDialog'
export * from './TagAdoptionDialog'
diff --git a/src/components/Editor/Sidebar/Tags/index.tsx b/src/components/Editor/Sidebar/Tags/index.tsx
index c1407aef34..4287a17f26 100644
--- a/src/components/Editor/Sidebar/Tags/index.tsx
+++ b/src/components/Editor/Sidebar/Tags/index.tsx
@@ -1,7 +1,7 @@
import { analytics } from '~/common/utils'
import {
+ EditorSearchSelectDialog,
IconHashTag24,
- SearchSelectDialog,
// SearchSelectNode,
Tag,
} from '~/components'
@@ -26,7 +26,7 @@ const SidebarTags = ({
disabled,
}: SidebarTagsProps) => {
return (
-
)}
-
+
)
}
From 15613e5ced3db722174de424eef151704505f315 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:12:54 +0800
Subject: [PATCH 07/92] feat(Editor): revise
---
.../TagCustomStagingArea/SelectedTags/index.tsx | 7 ++++++-
.../TagCustomStagingArea/SelectedTags/styles.css | 14 ++++++++++++--
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/components/Editor/TagCustomStagingArea/SelectedTags/index.tsx b/src/components/Editor/TagCustomStagingArea/SelectedTags/index.tsx
index abe57a6b10..ace0386291 100644
--- a/src/components/Editor/TagCustomStagingArea/SelectedTags/index.tsx
+++ b/src/components/Editor/TagCustomStagingArea/SelectedTags/index.tsx
@@ -1,4 +1,4 @@
-import { Tag } from '~/components'
+import { Tag, Translate } from '~/components'
import { SelectTag } from '~/components/SearchSelect/SearchingArea'
import { EditorRecommendedTagsQuery } from '~/gql/graphql'
@@ -16,6 +16,10 @@ type SelectedTagsProps = {
const SelectedTags: React.FC = ({ tags, onRemoveTag }) => {
return (
+
+
+
+
{tags.map((tag) => (
-
@@ -23,6 +27,7 @@ const SelectedTags: React.FC = ({ tags, onRemoveTag }) => {
tag={tag}
type="inline"
hasClose
+ active
disabled
removeTag={() => onRemoveTag(tag)}
/>
diff --git a/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css b/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css
index ac0738b3b5..68b67e9cb0 100644
--- a/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css
+++ b/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css
@@ -1,10 +1,20 @@
-.tagList {
+.selectedTags {
padding: 0 var(--spacing-base);
+ margin: var(--spacing-base) 0;
+}
+
+.tagList {
margin-top: var(--spacing-base);
+ line-height: 1;
& li {
display: inline-block;
margin-right: var(--spacing-tight);
- margin-bottom: var(--spacing-base);
}
}
+
+.hint {
+ font-size: var(--font-size-sm-s);
+ line-height: 1.125rem;
+ color: var(--color-grey);
+}
From 869ea5b2f1c10541084a47d2b0f259118f998d5b Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:17:54 +0800
Subject: [PATCH 08/92] feat(Editor): Not clickable when the number of tags
reaches the max
---
src/common/enums/index.ts | 2 ++
.../Editor/TagCustomStagingArea/RecommendedTags/index.tsx | 5 +++--
src/components/Editor/TagCustomStagingArea/index.tsx | 4 +++-
3 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/common/enums/index.ts b/src/common/enums/index.ts
index 6473056949..603e282f52 100644
--- a/src/common/enums/index.ts
+++ b/src/common/enums/index.ts
@@ -50,6 +50,8 @@ export const VERIFICATION_CODE_TYPES = {
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 = 10
export const MAX_TAG_CONTENT_LENGTH = 50
export const MAX_TAG_DESCRIPTION_LENGTH = 200
diff --git a/src/components/Editor/TagCustomStagingArea/RecommendedTags/index.tsx b/src/components/Editor/TagCustomStagingArea/RecommendedTags/index.tsx
index ad916f5b09..53cc4581cf 100644
--- a/src/components/Editor/TagCustomStagingArea/RecommendedTags/index.tsx
+++ b/src/components/Editor/TagCustomStagingArea/RecommendedTags/index.tsx
@@ -11,11 +11,13 @@ type EditorRecommendedTagsUserTagsEdgesNode = NonNullable<
type RecommendedTagsProps = {
tags: EditorRecommendedTagsUserTagsEdgesNode[]
onAddTag: (tag: SelectTag) => void
+ disabled?: boolean
}
const RecommendedTags: React.FC = ({
tags,
onAddTag,
+ disabled,
}) => {
return (
@@ -29,9 +31,8 @@ const RecommendedTags: React.FC = ({
onAddTag(tag)}
+ onClick={!disabled ? () => onAddTag(tag) : undefined}
/>
))}
diff --git a/src/components/Editor/TagCustomStagingArea/index.tsx b/src/components/Editor/TagCustomStagingArea/index.tsx
index 5268db9007..b9a46f1b85 100644
--- a/src/components/Editor/TagCustomStagingArea/index.tsx
+++ b/src/components/Editor/TagCustomStagingArea/index.tsx
@@ -1,6 +1,7 @@
import _uniqBy from 'lodash/uniqBy'
import { useContext } from 'react'
+import { MAX_ARTICLE_TAG_LENGTH } from '@/src/common/enums'
import { Spinner, Translate, usePublicQuery, ViewerContext } from '~/components'
import { SelectTag } from '~/components/SearchSelect/SearchingArea'
import { CustomStagingAreaProps } from '~/components/SearchSelect/StagingArea'
@@ -88,11 +89,12 @@ const TagCustomStagingArea = ({
onRemoveTag={removeTag}
/>
)}
- {hasRecommendedTags &&
}
+ {/* {hasRecommendedTags &&
} */}
{hasRecommendedTags && (
= MAX_ARTICLE_TAG_LENGTH}
/>
)}
From 394eb337a6cab70dfa338a2f7007a6f0d16fe075 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:21:05 +0800
Subject: [PATCH 09/92] feat(Editor): revise copy
---
src/common/enums/text.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/common/enums/text.ts b/src/common/enums/text.ts
index 5d0defee0e..4d7811ef1e 100644
--- a/src/common/enums/text.ts
+++ b/src/common/enums/text.ts
@@ -157,7 +157,7 @@ export const TEXT = {
helpCenter: '幫助中心',
hintAddTag:
'通過添加標籤幫助讀者更好地找到你的作品。如果沒有合適的標籤,你可以創建新的。',
- hintAddRecommendedTag: '下方是你近期使用過標籤,點選添加:',
+ hintAddRecommendedTag: '近期使用',
hintAddTagNoTag: '目前尚無標籤,立即添加提高作品曝光度!',
hintAddTagShort: '添加合適標籤,讓站內外讀者找到你的作品',
hintAddTagNamingRestriction:
@@ -567,7 +567,7 @@ export const TEXT = {
helpCenter: '帮助中心',
hintAddTag:
'通过添加标签帮助读者更好地找到你的作品。如果没有合适的标签,你可以创建新的。',
- hintAddRecommendedTag: '下方是你近期使用过标签,点选添加:',
+ hintAddRecommendedTag: '最近使用',
hintAddTagNoTag: '目前尚无标签,立即添加提高作品曝光度!',
hintAddTagShort: '添加适合标签,帮助读者找到你的作品',
hintAddTagNamingRestriction:
@@ -988,7 +988,7 @@ export const TEXT = {
helpCenter: 'Help Center',
hintAddTag:
'Adding tags helps readers find your articles. Add or create new tags.',
- hintAddRecommendedTag: 'Click to add tags you recently used :',
+ hintAddRecommendedTag: 'Recently used',
hintAddTagNoTag:
'Not using tags yet, add tags now to improve discoverability!',
hintAddTagShort: 'Adding tags helps readers find your articles.',
From 8d6f2d1a8d322739f23da5d3590aae257b6b7840 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:22:34 +0800
Subject: [PATCH 10/92] feat(Editor): revise style of
---
.../Editor/TagCustomStagingArea/RecommendedTags/styles.css | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/components/Editor/TagCustomStagingArea/RecommendedTags/styles.css b/src/components/Editor/TagCustomStagingArea/RecommendedTags/styles.css
index ae5005f62d..96c8bb51b6 100644
--- a/src/components/Editor/TagCustomStagingArea/RecommendedTags/styles.css
+++ b/src/components/Editor/TagCustomStagingArea/RecommendedTags/styles.css
@@ -4,7 +4,8 @@
}
.hint {
- font-size: var(--font-size-xs);
+ font-size: var(--font-size-sm-s);
+ line-height: 1.125rem;
color: var(--color-grey);
}
@@ -15,5 +16,6 @@
display: inline-block;
margin-right: var(--spacing-tight);
margin-bottom: var(--spacing-base);
+ line-height: 1.25rem;
}
}
From c18e7b10a1268d5306f526ad5ddde6da6e3a2b34 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:25:11 +0800
Subject: [PATCH 11/92] feat(Tag): add & revise
---
public/static/icons/16px/close.svg | 3 +++
src/components/Icon/IconClose16.tsx | 5 +++++
src/components/Icon/index.tsx | 1 +
src/components/Tag/index.tsx | 25 +++++++------------------
src/components/Tag/styles.css | 21 ++++++++++-----------
5 files changed, 26 insertions(+), 29 deletions(-)
create mode 100644 public/static/icons/16px/close.svg
create mode 100644 src/components/Icon/IconClose16.tsx
diff --git a/public/static/icons/16px/close.svg b/public/static/icons/16px/close.svg
new file mode 100644
index 0000000000..e7eac7fe5e
--- /dev/null
+++ b/public/static/icons/16px/close.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/components/Icon/IconClose16.tsx b/src/components/Icon/IconClose16.tsx
new file mode 100644
index 0000000000..7f27aa2a3a
--- /dev/null
+++ b/src/components/Icon/IconClose16.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/16px/close.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconClose16 = withIcon(Icon)
diff --git a/src/components/Icon/index.tsx b/src/components/Icon/index.tsx
index 67d559a2fc..a258a9825b 100644
--- a/src/components/Icon/index.tsx
+++ b/src/components/Icon/index.tsx
@@ -47,6 +47,7 @@ export * from './IconCircle24'
export * from './IconClap16'
export * from './IconClap24'
export * from './IconClear16'
+export * from './IconClose16'
export * from './IconClose32'
export * from './IconCollapse16'
export * from './IconCollection24'
diff --git a/src/components/Tag/index.tsx b/src/components/Tag/index.tsx
index e0520903e9..61b88198ee 100644
--- a/src/components/Tag/index.tsx
+++ b/src/components/Tag/index.tsx
@@ -3,13 +3,7 @@ import gql from 'graphql-tag'
import Link from 'next/link'
import { clampTagLength, toPath } from '~/common/utils'
-import {
- IconClear16,
- IconHashTag16,
- IconProps,
- TextIcon,
- TextIconProps,
-} from '~/components'
+import { IconClose16, IconProps, TextIcon, TextIconProps } from '~/components'
import { DigestTagFragment } from '~/gql/graphql'
import styles from './styles.css'
@@ -113,9 +107,9 @@ export const Tag = ({
color: active ? 'green' : 'grey',
}
textIconProps = {
- size: 'sm',
- weight: 'md',
- spacing: 0,
+ size: 'sm-s',
+ weight: 'normal',
+ spacing: 'xxtight',
color: active ? 'white' : 'grey-darker',
}
break
@@ -141,13 +135,8 @@ export const Tag = ({
const Inner = () => (
<>
- }
- {...textIconProps}
- size={textIconProps.size}
- allowUserSelect
- >
- {tagName}
+
+ # {tagName}
{hasClose && (
@@ -157,7 +146,7 @@ export const Tag = ({
removeTag?.(tag)
}}
>
-
+
)}
diff --git a/src/components/Tag/styles.css b/src/components/Tag/styles.css
index a0cc418f0d..f54ec7fd1e 100644
--- a/src/components/Tag/styles.css
+++ b/src/components/Tag/styles.css
@@ -42,11 +42,17 @@
.inline {
display: inline-flex;
align-items: center;
- height: 1.5rem;
- padding: 0 var(--spacing-tight) 0 var(--spacing-x-tight);
- line-height: 1.5rem;
+ height: 1.25rem;
+ padding: 0 var(--spacing-x-tight) 0 var(--spacing-x-tight);
+ line-height: 1.25rem;
background: var(--color-grey-lighter);
- border-radius: 2rem;
+ border-radius: 1.25rem;
+
+ &.disabled {
+ & .name {
+ color: var(--color-grey);
+ }
+ }
& .name {
color: var(--color-black);
@@ -58,13 +64,6 @@
margin-left: 3px;
}
- &:not(.disabled) {
- &:hover,
- &:focus {
- background: var(--color-green-lighter);
- }
- }
-
&.clickable {
cursor: pointer;
}
From c3184c5999c36e076887764afa947471abb599a2 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 23 Mar 2023 15:27:25 +0800
Subject: [PATCH 12/92] feat(SearchSelect): revise &
---
.../SearchingArea/SearchInput/index.tsx | 25 +++++++++++--------
.../SearchingArea/SearchInput/styles.css | 5 +++-
.../SearchSelect/SearchingArea/index.tsx | 14 ++++++++---
3 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx b/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
index d860b43095..f1551bd707 100644
--- a/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
+++ b/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
@@ -8,13 +8,14 @@ import styles from './styles.css'
export type SearchType = 'Article' | 'Tag' | 'User' | 'Invitee'
-interface SearchInputProps {
+export interface SearchInputProps {
type: SearchType
value: string
onChange: (value: string) => void
onSubmit: (value: string) => void
onFocus: () => void
onBlur: () => void
+ autoFocus?: boolean
}
const SearchInput: React.FC = ({
@@ -24,27 +25,28 @@ const SearchInput: React.FC = ({
onSubmit,
onFocus,
onBlur,
+ autoFocus,
}) => {
const fieldId = `search-input-${type}`.toLocaleLowerCase()
const { lang } = useContext(LanguageContext)
const textAriaLabel = translate({ id: 'search', lang })
const textPlaceholder = {
Article: translate({
- zh_hant: '搜尋作品標題…',
- zh_hans: '搜索作品标题…',
- en: 'Search articles...',
+ zh_hant: '搜尋作品標題',
+ zh_hans: '搜索作品标题',
+ en: 'Search articles',
lang,
}),
Tag: translate({
- zh_hant: '搜尋標籤…',
- zh_hans: '搜索标签…',
- en: 'Search tags...',
+ zh_hant: '搜尋標籤',
+ zh_hans: '搜索标签',
+ en: 'Search tags',
lang,
}),
User: translate({
- zh_hant: '搜尋作者…',
- zh_hans: '搜索作者…',
- en: 'Search authors...',
+ zh_hant: '搜尋作者',
+ zh_hans: '搜索作者',
+ en: 'Search authors',
lang,
}),
Invitee: translate({
@@ -72,6 +74,7 @@ const SearchInput: React.FC = ({
id={fieldId}
type="search"
name="q"
+ autoFocus={!!autoFocus}
value={value}
aria-label={textAriaLabel}
placeholder={textPlaceholder[type]}
@@ -91,7 +94,7 @@ const SearchInput: React.FC = ({
type="submit"
aria-label={translate({ id: 'search', lang })}
>
-
+
{value && (
diff --git a/src/components/SearchSelect/SearchingArea/SearchInput/styles.css b/src/components/SearchSelect/SearchingArea/SearchInput/styles.css
index 9cc858cf45..855c5c0435 100644
--- a/src/components/SearchSelect/SearchingArea/SearchInput/styles.css
+++ b/src/components/SearchSelect/SearchingArea/SearchInput/styles.css
@@ -4,6 +4,9 @@
}
form {
+ @mixin border-top-grey;
+ @mixin border-bottom-grey;
+
position: relative;
width: 100%;
height: var(--search-input-height);
@@ -17,7 +20,7 @@ form {
padding: 0 calc(var(--search-input-button-width) + var(--spacing-x-tight));
font-size: var(--font-size-sm);
color: var(--color-black);
- background-color: var(--color-grey-lighter);
+ caret-color: var(--color-matters-green);
&::placeholder {
color: var(--color-grey);
diff --git a/src/components/SearchSelect/SearchingArea/index.tsx b/src/components/SearchSelect/SearchingArea/index.tsx
index 152b61e280..e0d81f8a23 100644
--- a/src/components/SearchSelect/SearchingArea/index.tsx
+++ b/src/components/SearchSelect/SearchingArea/index.tsx
@@ -30,7 +30,10 @@ import styles from '../styles.css'
import CreateTag from './CreateTag'
import { LIST_VIEWER_ARTICLES, SELECT_SEARCH } from './gql'
import InviteEmail from './InviteEmail'
-import SearchInput, { SearchType as SearchInputType } from './SearchInput'
+import SearchInput, {
+ SearchInputProps,
+ SearchType as SearchInputType,
+} from './SearchInput'
/**
* This is a sub-component of search-and-select, and it will show
@@ -52,7 +55,7 @@ export type SelectUser = NonNullable<
SelectSearchQuery['search']['edges']
>[0]['node'] & { __typename: 'User' }
-interface SearchingAreaProps {
+type SearchingAreaProps = {
searchType: SearchType
searchFilter?: SearchFilter
searchExclude?: SearchExclude
@@ -64,7 +67,7 @@ interface SearchingAreaProps {
createTag?: boolean
inviteEmail?: boolean
-}
+} & Pick
type Mode = 'search' | 'list'
@@ -80,6 +83,7 @@ const SearchingArea: React.FC = ({
createTag,
inviteEmail,
+ autoFocus,
}) => {
const viewer = useContext(ViewerContext)
@@ -267,6 +271,7 @@ const SearchingArea: React.FC = ({
onSubmit={search}
onFocus={onSearchInputFocus}
onBlur={onSearchInputBlur}
+ autoFocus
/>
{inSearchingArea && (
@@ -274,7 +279,8 @@ const SearchingArea: React.FC = ({
{searching && }
{/* Search */}
- {isSearchMode &&
+ {searchKey.length > 0 &&
+ isSearchMode &&
!searching &&
!hasNodes &&
!canCreateTag &&
From ac0916a443be241c69c906dd6c0b58b33e12cdc6 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 13:43:43 +0800
Subject: [PATCH 13/92] fix(SearchSelect): fix search input tap backspace bug
---
src/components/SearchSelect/SearchingArea/index.tsx | 7 -------
1 file changed, 7 deletions(-)
diff --git a/src/components/SearchSelect/SearchingArea/index.tsx b/src/components/SearchSelect/SearchingArea/index.tsx
index e0d81f8a23..b66205843b 100644
--- a/src/components/SearchSelect/SearchingArea/index.tsx
+++ b/src/components/SearchSelect/SearchingArea/index.tsx
@@ -182,13 +182,6 @@ const SearchingArea: React.FC = ({
toSearchingArea()
return
}
-
- if (value) {
- toSearchingArea()
- } else {
- toStagingArea()
- setSearchingNodes([])
- }
}
const onSearchInputFocus = () => {
if (hasListMode) {
From 7755c1aaa5b9df9849d751cac14d1c900a640245 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 13:50:22 +0800
Subject: [PATCH 14/92] feat(Editor): add
---
.../ArticleDigest/Dropdown/index.tsx | 3 +
.../ConfirmDialog.tsx | 57 ++++++++++++++
.../Editor/ArticleCustomStagingArea/index.tsx | 76 +++++++++++++++++++
.../ArticleCustomStagingArea/styles.css | 22 ++++++
4 files changed, 158 insertions(+)
create mode 100644 src/components/Editor/ArticleCustomStagingArea/ConfirmDialog.tsx
create mode 100644 src/components/Editor/ArticleCustomStagingArea/index.tsx
create mode 100644 src/components/Editor/ArticleCustomStagingArea/styles.css
diff --git a/src/components/ArticleDigest/Dropdown/index.tsx b/src/components/ArticleDigest/Dropdown/index.tsx
index 6be9a6c794..361c475d31 100644
--- a/src/components/ArticleDigest/Dropdown/index.tsx
+++ b/src/components/ArticleDigest/Dropdown/index.tsx
@@ -15,6 +15,7 @@ export type ArticleDigestDropdownProps = {
titleTextSize?: ArticleDigestTitleTextSize
disabled?: boolean
extraButton?: React.ReactNode
+ lineClamp?: boolean
} & Pick<
CardProps,
'spacing' | 'bgColor' | 'bgActiveColor' | 'borderRadius' | 'onClick'
@@ -47,6 +48,7 @@ export const ArticleDigestDropdown = ({
titleTextSize,
disabled,
extraButton,
+ lineClamp,
// Card Props
...cardProps
@@ -72,6 +74,7 @@ export const ArticleDigestDropdown = ({
textSize={titleTextSize}
disabled={cardDisabled}
is="h3"
+ lineClamp={lineClamp}
/>
{!isBanned && extraButton}
diff --git a/src/components/Editor/ArticleCustomStagingArea/ConfirmDialog.tsx b/src/components/Editor/ArticleCustomStagingArea/ConfirmDialog.tsx
new file mode 100644
index 0000000000..b0a0e56605
--- /dev/null
+++ b/src/components/Editor/ArticleCustomStagingArea/ConfirmDialog.tsx
@@ -0,0 +1,57 @@
+import { Dialog, Translate, useDialogSwitch } from '~/components'
+
+interface ConfirmDialogProps {
+ removeArticle: () => void
+ children: ({ openDialog }: { openDialog: () => void }) => React.ReactNode
+}
+
+const ConfirmDialog = ({ removeArticle, children }: ConfirmDialogProps) => {
+ const { show, openDialog, closeDialog } = useDialogSwitch(true)
+
+ return (
+ <>
+ {children({ openDialog })}
+
+
+ >
+ )
+}
+
+const LazyConfirmDialog = (props: ConfirmDialogProps) => (
+ }>
+ {({ openDialog }) => <>{props.children({ openDialog })}>}
+
+)
+
+export default LazyConfirmDialog
diff --git a/src/components/Editor/ArticleCustomStagingArea/index.tsx b/src/components/Editor/ArticleCustomStagingArea/index.tsx
new file mode 100644
index 0000000000..1c18a3b68f
--- /dev/null
+++ b/src/components/Editor/ArticleCustomStagingArea/index.tsx
@@ -0,0 +1,76 @@
+import {
+ ArticleDigestDropdown,
+ Button,
+ IconClose16,
+ Translate,
+} from '~/components'
+import { SelectArticle } from '~/components/SearchSelect/SearchingArea'
+import { CustomStagingAreaProps } from '~/components/SearchSelect/StagingArea'
+
+import ConfirmDialog from './ConfirmDialog'
+import styles from './styles.css'
+
+const ArticleCustomStagingArea = ({
+ nodes: articles,
+ setNodes: setArticles,
+ hint,
+}: CustomStagingAreaProps) => {
+ const removeArticle = (article: SelectArticle) => {
+ const newArticles = articles.filter((a) => a.node.id !== article.id)
+ setArticles(newArticles)
+ }
+
+ const hasArticles = articles.length > 0
+
+ if (!hasArticles) {
+ return (
+
+ )
+ }
+
+ return (
+
+
+
+
+
+
+ {articles.map(
+ ({ node }) =>
+ node.__typename === 'Article' && (
+ -
+
+ {
+ removeArticle(node as SelectArticle)
+ }}
+ >
+ {({ openDialog }) => (
+
+ )}
+
+
+ )
+ )}
+
+
+
+ )
+}
+
+export default ArticleCustomStagingArea
diff --git a/src/components/Editor/ArticleCustomStagingArea/styles.css b/src/components/Editor/ArticleCustomStagingArea/styles.css
new file mode 100644
index 0000000000..d0ce88e353
--- /dev/null
+++ b/src/components/Editor/ArticleCustomStagingArea/styles.css
@@ -0,0 +1,22 @@
+.customArticleArea {
+ padding: var(--spacing-base);
+
+ & .hint {
+ padding-bottom: var(--spacing-base);
+ font-size: var(--font-size-sm-s);
+ line-height: 1.125rem;
+ color: var(--color-grey);
+ }
+
+ & .node {
+ @mixin flex-start-space-between;
+
+ & :global(section) {
+ width: calc(100% - 1.5rem);
+ }
+ }
+
+ & .node + .node {
+ margin-top: var(--spacing-loose);
+ }
+}
From 1df489f32ffdbbacce374360e6f2f52a485c04f0 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 13:53:40 +0800
Subject: [PATCH 15/92] feat(EditorSearchSelectForm): add searchType.Article
---
.../Forms/EditorSearchSelectForm/index.tsx | 24 +++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/components/Forms/EditorSearchSelectForm/index.tsx b/src/components/Forms/EditorSearchSelectForm/index.tsx
index 2d496856ca..7911342d37 100644
--- a/src/components/Forms/EditorSearchSelectForm/index.tsx
+++ b/src/components/Forms/EditorSearchSelectForm/index.tsx
@@ -1,6 +1,10 @@
import { useEffect, useState } from 'react'
-import { MAX_ARTICLE_TAG_LENGTH, TextId } from '~/common/enums'
+import {
+ MAX_ARTICLE_COLLECT_LENGTH,
+ MAX_ARTICLE_TAG_LENGTH,
+ TextId,
+} from '~/common/enums'
import { Button, Dialog, IconAdd16, TextIcon, Translate } from '~/components'
import SearchingArea, {
SearchType,
@@ -104,7 +108,12 @@ const EditorSearchSelectForm = ({
toStagingArea()
}
- const enableAdd = stagingNodes.length < MAX_ARTICLE_TAG_LENGTH
+ const maxNodesLength =
+ searchType === 'Article'
+ ? MAX_ARTICLE_COLLECT_LENGTH
+ : MAX_ARTICLE_TAG_LENGTH
+
+ const enableAdd = stagingNodes.length < maxNodesLength
const onClickSave = async () => {
await onSave(
@@ -137,10 +146,17 @@ const EditorSearchSelectForm = ({
color={enableAdd ? 'green' : 'grey'}
size="md"
>
-
+ {searchType === 'Tag' && (
+
+ )}
+ {searchType === 'Article' && (
+
+ )}
- ({stagingNodes.length}/3)
+
+ ({stagingNodes.length}/{maxNodesLength})
+
)}
From 009c1bb3302bddc909e65c72f7538b984a1d12e2 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 13:55:48 +0800
Subject: [PATCH 16/92] feat(Editor): revise
---
src/components/Editor/BottomBar/index.tsx | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/components/Editor/BottomBar/index.tsx b/src/components/Editor/BottomBar/index.tsx
index c90eb48f36..b9df5c0e70 100644
--- a/src/components/Editor/BottomBar/index.tsx
+++ b/src/components/Editor/BottomBar/index.tsx
@@ -3,6 +3,7 @@ import { useContext } from 'react'
import { translate } from '~/common/utils'
import {
+ EditorSearchSelectDialog,
IconCollection24,
IconHashTag24,
IconImage24,
@@ -12,7 +13,6 @@ import {
TextIcon,
Translate,
} from '~/components'
-import { SearchSelectDialog } from '~/components/Dialogs/SearchSelectDialog'
import {
SetCollectionProps,
SetCoverProps,
@@ -28,6 +28,7 @@ import {
SearchExclude,
} from '~/gql/graphql'
+import ArticleCustomStagingArea from '../ArticleCustomStagingArea'
import SetCover from '../SetCover'
import TagCustomStagingArea from '../TagCustomStagingArea'
import AccessDialog from './AccessDialog'
@@ -151,7 +152,7 @@ const BottomBar: React.FC = ({
{/* Tags */}
- = ({
)}
-
+
{/* Collection */}
- = ({
}
nodes={collection}
saving={collectionSaving}
+ CustomStagingArea={ArticleCustomStagingArea}
>
{({ openDialog }) => (
)}
-
+
{/* Circle & License & Support Feedback & ISCN & canComment */}
From abca95cf7dfc6c52ff4caeda7ef002699a89b044 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 13:58:08 +0800
Subject: [PATCH 17/92] feat(SearchSelect): revise StagingArea
---
src/components/SearchSelect/StagingArea/index.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/SearchSelect/StagingArea/index.tsx b/src/components/SearchSelect/StagingArea/index.tsx
index bdaa1f2d34..8dc744f570 100644
--- a/src/components/SearchSelect/StagingArea/index.tsx
+++ b/src/components/SearchSelect/StagingArea/index.tsx
@@ -69,6 +69,7 @@ const StagingArea: React.FC = ({
return (
)
}
From 60c4bc4bf9f377758ad7dad268adfdbfae429c9e Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 13:59:39 +0800
Subject: [PATCH 18/92] feat(Editor): revise SelectedTags list style
---
.../Editor/TagCustomStagingArea/SelectedTags/styles.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css b/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css
index 68b67e9cb0..5d4aeb2ce7 100644
--- a/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css
+++ b/src/components/Editor/TagCustomStagingArea/SelectedTags/styles.css
@@ -4,11 +4,11 @@
}
.tagList {
- margin-top: var(--spacing-base);
line-height: 1;
& li {
display: inline-block;
+ margin-top: var(--spacing-base);
margin-right: var(--spacing-tight);
}
}
From 447a1dbb2d4ec641300e6d053cb7a9d5ee3ea5b4 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 14:01:09 +0800
Subject: [PATCH 19/92] feat(Editor): update
---
src/components/Editor/Sidebar/Collection/index.tsx | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/components/Editor/Sidebar/Collection/index.tsx b/src/components/Editor/Sidebar/Collection/index.tsx
index 94ae9189cc..7664052228 100644
--- a/src/components/Editor/Sidebar/Collection/index.tsx
+++ b/src/components/Editor/Sidebar/Collection/index.tsx
@@ -1,5 +1,8 @@
-import { ArticleDigestDropdown, IconCollection24 } from '~/components'
-import { SearchSelectDialog } from '~/components/Dialogs/SearchSelectDialog'
+import {
+ ArticleDigestDropdown,
+ EditorSearchSelectDialog,
+ IconCollection24,
+} from '~/components'
import { SetCollectionProps } from '~/components/Editor'
import { SearchSelectNode } from '~/components/Forms/SearchSelectForm'
import {
@@ -7,6 +10,7 @@ import {
SearchExclude,
} from '~/gql/graphql'
+import ArticleCustomStagingArea from '../../ArticleCustomStagingArea'
import Box from '../Box'
import styles from './styles.css'
@@ -21,7 +25,7 @@ const SidebarCollection = ({
disabled,
}: SidebarCollectionProps) => {
return (
-
{({ openDialog }) => (
)}
-
+
)
}
From ed13a0b7aa647c7224268e12be1e233052699da3 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 16:30:48 +0800
Subject: [PATCH 20/92] feat(Editor): revise ArticleCustomStagingArea style
---
src/components/Editor/ArticleCustomStagingArea/index.tsx | 2 +-
src/components/Editor/ArticleCustomStagingArea/styles.css | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/components/Editor/ArticleCustomStagingArea/index.tsx b/src/components/Editor/ArticleCustomStagingArea/index.tsx
index 1c18a3b68f..47997792ae 100644
--- a/src/components/Editor/ArticleCustomStagingArea/index.tsx
+++ b/src/components/Editor/ArticleCustomStagingArea/index.tsx
@@ -25,7 +25,7 @@ const ArticleCustomStagingArea = ({
if (!hasArticles) {
return (
-
+
diff --git a/src/components/Editor/ArticleCustomStagingArea/styles.css b/src/components/Editor/ArticleCustomStagingArea/styles.css
index d0ce88e353..517b7411b3 100644
--- a/src/components/Editor/ArticleCustomStagingArea/styles.css
+++ b/src/components/Editor/ArticleCustomStagingArea/styles.css
@@ -8,6 +8,10 @@
color: var(--color-grey);
}
+ & .emptyHint {
+ text-align: center;
+ }
+
& .node {
@mixin flex-start-space-between;
From 972439644f16660c70e5c99133b2b0abf570d636 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 24 Mar 2023 16:33:25 +0800
Subject: [PATCH 21/92] feat(EditorSearchSelectForm): revise styles and copy
---
src/components/Forms/EditorSearchSelectForm/index.tsx | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/components/Forms/EditorSearchSelectForm/index.tsx b/src/components/Forms/EditorSearchSelectForm/index.tsx
index 7911342d37..97331501ee 100644
--- a/src/components/Forms/EditorSearchSelectForm/index.tsx
+++ b/src/components/Forms/EditorSearchSelectForm/index.tsx
@@ -142,12 +142,13 @@ const EditorSearchSelectForm = ({
)}
{inSearchingArea && (
From ab25a4738ebd851c61c00cf45f820d94ce7c04a6 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Mon, 27 Mar 2023 12:45:24 +0800
Subject: [PATCH 23/92] feat(Editor): sync staging nodes
---
.../EditorSearchSelectDialog/index.tsx | 1 -
.../Forms/EditorSearchSelectForm/index.tsx | 28 +++++++++++--------
2 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/src/components/Dialogs/EditorSearchSelectDialog/index.tsx b/src/components/Dialogs/EditorSearchSelectDialog/index.tsx
index a122a66632..c82ede9e6e 100644
--- a/src/components/Dialogs/EditorSearchSelectDialog/index.tsx
+++ b/src/components/Dialogs/EditorSearchSelectDialog/index.tsx
@@ -32,7 +32,6 @@ const BaseSearchSelectDialog = ({
{...props}
onSave={async (nodes: SelectNode[]) => {
await props.onSave(nodes)
- closeDialog()
}}
closeDialog={closeDialog}
/>
diff --git a/src/components/Forms/EditorSearchSelectForm/index.tsx b/src/components/Forms/EditorSearchSelectForm/index.tsx
index e54c0f2f9a..68dfba80da 100644
--- a/src/components/Forms/EditorSearchSelectForm/index.tsx
+++ b/src/components/Forms/EditorSearchSelectForm/index.tsx
@@ -99,15 +99,25 @@ const EditorSearchSelectForm = ({
// data
const [stagingNodes, setStagingNodes] =
useState(initStagingNodes)
- const addNodeToStaging = (node: SelectNode) => {
+ const addNodeToStaging = async (node: SelectNode) => {
setStagingNodes([
...stagingNodes.filter(({ node: n }) => n.id !== node.id),
{ node, selected: true },
])
-
+ await onSave([
+ ...stagingNodes
+ .filter(({ node: n }) => n.id !== node.id)
+ .map(({ node }) => node),
+ node,
+ ])
toStagingArea()
}
+ const syncStagingNodes = async (nodes: StagingNode[]) => {
+ setStagingNodes(nodes)
+ await onSave(nodes.map(({ node }) => node))
+ }
+
const maxNodesLength =
searchType === 'Article'
? MAX_ARTICLE_COLLECT_LENGTH
@@ -115,24 +125,18 @@ const EditorSearchSelectForm = ({
const enableAdd = stagingNodes.length < maxNodesLength
- const onClickSave = async () => {
- await onSave(
- stagingNodes.filter(({ selected }) => !!selected).map(({ node }) => node)
- )
- }
-
return (
<>
>}
rightButton={
}
+ text={headerRightButtonText || }
loading={saving}
/>
}
@@ -180,7 +184,7 @@ const EditorSearchSelectForm = ({
{inStagingArea && (
Date: Mon, 27 Mar 2023 21:27:24 +0700
Subject: [PATCH 24/92] feat(form): disable validateOnBlur
---
lang/default.json | 8 ++++----
lang/en.json | 2 +-
src/components/Dialogs/HelpDialog/index.tsx | 15 ++++++++++++---
.../SetPaymentPointerForm.tsx | 1 +
src/components/Dialogs/TagDialog/Content.tsx | 1 +
.../ToggleAccess/SupportSettingDialog/Content.tsx | 1 +
src/components/Forms/ChangeEmailForm/Confirm.tsx | 1 +
src/components/Forms/ChangeEmailForm/Request.tsx | 1 +
.../Forms/ChangePasswordForm/Confirm.tsx | 1 +
.../Forms/ChangePasswordForm/Request.tsx | 1 +
.../Forms/ChangeUserNameForm/Confirm.tsx | 1 +
src/components/Forms/CreateCircleForm/Init.tsx | 1 +
src/components/Forms/CreateCircleForm/Profile.tsx | 1 +
src/components/Forms/EmailLoginForm/index.tsx | 1 +
src/components/Forms/EmailSignUpForm/Init.tsx | 3 ++-
src/components/Forms/EmailSignUpForm/Password.tsx | 1 +
.../Forms/PaymentForm/AddCredit/index.tsx | 1 +
.../Forms/PaymentForm/PayTo/Confirm/index.tsx | 1 +
.../Forms/PaymentForm/PayTo/SetAmount/index.tsx | 1 +
.../Forms/PaymentForm/Payout/Confirm.tsx | 1 +
.../Forms/PaymentForm/ResetPassword/Confirm.tsx | 1 +
.../Forms/PaymentForm/ResetPassword/Request.tsx | 1 +
.../Forms/PaymentForm/SetPassword/index.tsx | 1 +
.../SubscribeCircle/PasswordPayment.tsx | 1 +
src/components/Forms/WalletAuthForm/Connect.tsx | 1 +
.../DropdownActions/EditProfileDialog/Content.tsx | 1 +
26 files changed, 41 insertions(+), 9 deletions(-)
diff --git a/lang/default.json b/lang/default.json
index ad3125a28d..a1501e2046 100644
--- a/lang/default.json
+++ b/lang/default.json
@@ -951,10 +951,6 @@
"defaultMessage": "Topics",
"description": ""
},
- "l5vWO8": {
- "defaultMessage": "Your Matters display name, can be changed later",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
- },
"lD4FPZ": {
"defaultMessage": "Enter Email",
"description": ""
@@ -967,6 +963,10 @@
"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"
},
+ "ldNgRA": {
+ "defaultMessage": "Display name, can be changed later",
+ "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ },
"lhaIoi": {
"defaultMessage": "Enter Display Name",
"description": ""
diff --git a/lang/en.json b/lang/en.json
index fda640be9f..6fc7ed886a 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -96,7 +96,7 @@
"description": ""
},
"l5vWO8": {
- "defaultMessage": "Your Matters display name, can be changed later",
+ "defaultMessage": "Display name, can be changed later",
"description": "src/components/Forms/EmailSignUpForm/Init.tsx"
},
"5sg7KC": {
diff --git a/src/components/Dialogs/HelpDialog/index.tsx b/src/components/Dialogs/HelpDialog/index.tsx
index 8e9ea7a741..31ff86a96c 100644
--- a/src/components/Dialogs/HelpDialog/index.tsx
+++ b/src/components/Dialogs/HelpDialog/index.tsx
@@ -23,11 +23,17 @@ const ReadTime = () => (
<>
} weight="md">
-
+
-
+
>
@@ -41,7 +47,10 @@ const ReadCount = () => (
-
+
>
diff --git a/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx b/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx
index 5e26342532..4ea0d7e25d 100644
--- a/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx
+++ b/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx
@@ -68,6 +68,7 @@ const SetPaymentPointerForm: React.FC = ({
initialValues: {
paymentPointer: defaultPaymentPointer,
},
+ validateOnBlur: false,
validate: ({ paymentPointer }) =>
_pickBy({
paymentPointer: validatePaymentPointer(paymentPointer, lang),
diff --git a/src/components/Dialogs/TagDialog/Content.tsx b/src/components/Dialogs/TagDialog/Content.tsx
index 9caf481859..06a744fba9 100644
--- a/src/components/Dialogs/TagDialog/Content.tsx
+++ b/src/components/Dialogs/TagDialog/Content.tsx
@@ -106,6 +106,7 @@ const TagDialogContent: React.FC = ({
newCover: UNCHANGED_FIELD,
newDescription: description || '',
},
+ validateOnBlur: false,
validate: ({ newContent }) =>
_pickBy({
newContent: validateTagName(newContent, lang),
diff --git a/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx b/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx
index 92c534c341..7f798c24fb 100644
--- a/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx
+++ b/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx
@@ -67,6 +67,7 @@ const SupportSettingDialogContent: React.FC = ({
: '',
replyToDonator: content?.replyToDonator ? content.replyToDonator : '',
},
+ validateOnBlur: false,
validate: ({ requestForDonation, replyToDonator }) =>
_pickBy({
requestForDonation: validateSupportWords(requestForDonation!, lang),
diff --git a/src/components/Forms/ChangeEmailForm/Confirm.tsx b/src/components/Forms/ChangeEmailForm/Confirm.tsx
index 621cddd9a5..f89efebfe1 100644
--- a/src/components/Forms/ChangeEmailForm/Confirm.tsx
+++ b/src/components/Forms/ChangeEmailForm/Confirm.tsx
@@ -74,6 +74,7 @@ const Confirm: React.FC = ({
email: '',
code: '',
},
+ validateOnBlur: false,
validate: ({ email, code }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: false }),
diff --git a/src/components/Forms/ChangeEmailForm/Request.tsx b/src/components/Forms/ChangeEmailForm/Request.tsx
index 65198f9cc7..5ce743da1a 100644
--- a/src/components/Forms/ChangeEmailForm/Request.tsx
+++ b/src/components/Forms/ChangeEmailForm/Request.tsx
@@ -58,6 +58,7 @@ const Request: React.FC = ({
email: defaultEmail,
code: '',
},
+ validateOnBlur: false,
validate: ({ email, code }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
diff --git a/src/components/Forms/ChangePasswordForm/Confirm.tsx b/src/components/Forms/ChangePasswordForm/Confirm.tsx
index 7833a5b8eb..ca954a2779 100644
--- a/src/components/Forms/ChangePasswordForm/Confirm.tsx
+++ b/src/components/Forms/ChangePasswordForm/Confirm.tsx
@@ -84,6 +84,7 @@ const Confirm: React.FC = ({
password: '',
comparedPassword: '',
},
+ validateOnBlur: false,
validate: ({ password, comparedPassword }) =>
_pickBy({
password: validatePassword(password, lang),
diff --git a/src/components/Forms/ChangePasswordForm/Request.tsx b/src/components/Forms/ChangePasswordForm/Request.tsx
index fc10e4dc45..07656dd7d5 100644
--- a/src/components/Forms/ChangePasswordForm/Request.tsx
+++ b/src/components/Forms/ChangePasswordForm/Request.tsx
@@ -64,6 +64,7 @@ const Request: React.FC = ({
initialValues: {
email: defaultEmail,
},
+ validateOnBlur: false,
validate: ({ email }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
diff --git a/src/components/Forms/ChangeUserNameForm/Confirm.tsx b/src/components/Forms/ChangeUserNameForm/Confirm.tsx
index fdb8676910..e6f01b89a7 100644
--- a/src/components/Forms/ChangeUserNameForm/Confirm.tsx
+++ b/src/components/Forms/ChangeUserNameForm/Confirm.tsx
@@ -67,6 +67,7 @@ const Confirm: React.FC = ({
userName: '',
comparedUserName: '',
},
+ validateOnBlur: false,
validate: ({ userName, comparedUserName }) =>
_pickBy({
userName: validateUserName(userName, lang),
diff --git a/src/components/Forms/CreateCircleForm/Init.tsx b/src/components/Forms/CreateCircleForm/Init.tsx
index 0014881d6c..01eb16aacd 100644
--- a/src/components/Forms/CreateCircleForm/Init.tsx
+++ b/src/components/Forms/CreateCircleForm/Init.tsx
@@ -70,6 +70,7 @@ const Init: React.FC = ({
displayName: '',
amount: PAYMENT_MINIMAL_CIRCLE_AMOUNT.HKD,
},
+ validateOnBlur: false,
validate: ({ name, displayName, amount }) =>
_pickBy({
name: validateCircleName(name, lang),
diff --git a/src/components/Forms/CreateCircleForm/Profile.tsx b/src/components/Forms/CreateCircleForm/Profile.tsx
index dd6ab491a9..ca06e105e0 100644
--- a/src/components/Forms/CreateCircleForm/Profile.tsx
+++ b/src/components/Forms/CreateCircleForm/Profile.tsx
@@ -78,6 +78,7 @@ const Init: React.FC = ({ circle, type, purpose, closeDialog }) => {
displayName: circle.displayName || '',
description: circle.description || '',
},
+ validateOnBlur: false,
validate: ({ displayName, description }) =>
_pickBy({
displayName: !isCreate
diff --git a/src/components/Forms/EmailLoginForm/index.tsx b/src/components/Forms/EmailLoginForm/index.tsx
index 7122f4e758..8694185c88 100644
--- a/src/components/Forms/EmailLoginForm/index.tsx
+++ b/src/components/Forms/EmailLoginForm/index.tsx
@@ -101,6 +101,7 @@ export const EmailLoginForm: React.FC = ({
email: '',
password: '',
},
+ validateOnBlur: false,
validate: ({ email, password }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
diff --git a/src/components/Forms/EmailSignUpForm/Init.tsx b/src/components/Forms/EmailSignUpForm/Init.tsx
index f7cfb49969..0d90cf5572 100644
--- a/src/components/Forms/EmailSignUpForm/Init.tsx
+++ b/src/components/Forms/EmailSignUpForm/Init.tsx
@@ -75,6 +75,7 @@ const Init: React.FC = ({
email: '',
tos: true,
},
+ validateOnBlur: false,
validate: ({ displayName, email, tos }) =>
_pickBy({
displayName: validateDisplayName(displayName, lang),
@@ -121,7 +122,7 @@ const Init: React.FC = ({
name="displayName"
required
placeholder={intl.formatMessage({
- defaultMessage: 'Your Matters display name, can be changed later',
+ defaultMessage: 'Display name, can be changed later',
description: 'src/components/Forms/EmailSignUpForm/Init.tsx',
})}
value={values.displayName}
diff --git a/src/components/Forms/EmailSignUpForm/Password.tsx b/src/components/Forms/EmailSignUpForm/Password.tsx
index be96f6df1c..c6c245fa65 100644
--- a/src/components/Forms/EmailSignUpForm/Password.tsx
+++ b/src/components/Forms/EmailSignUpForm/Password.tsx
@@ -102,6 +102,7 @@ const Password: React.FC = ({
password: '',
comparedPassword: '',
},
+ validateOnBlur: false,
validate: ({ password, comparedPassword }) =>
_pickBy({
password: validatePassword(password, lang),
diff --git a/src/components/Forms/PaymentForm/AddCredit/index.tsx b/src/components/Forms/PaymentForm/AddCredit/index.tsx
index 6622d18e64..1cbb4568fe 100644
--- a/src/components/Forms/PaymentForm/AddCredit/index.tsx
+++ b/src/components/Forms/PaymentForm/AddCredit/index.tsx
@@ -122,6 +122,7 @@ const BaseAddCredit: React.FC = ({
initialValues: {
amount: defaultAmount || PAYMENT_DEFAULT_ADD_CREDIT_AMOUNT[currency],
},
+ validateOnBlur: false,
validate: ({ amount }) =>
_pickBy({
amount: validateAmount(amount, lang),
diff --git a/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx b/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
index 377e4b7bd3..44967fb3d4 100644
--- a/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
+++ b/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
@@ -111,6 +111,7 @@ const Confirm: React.FC = ({
initialValues: {
password: '',
},
+ validateOnBlur: false,
validate: ({ password }) =>
_pickBy({
password: validatePaymentPassword(password, lang),
diff --git a/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx b/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx
index f2abb6c4f8..c6c23dc409 100644
--- a/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx
+++ b/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx
@@ -177,6 +177,7 @@ const SetAmount: React.FC = ({
amount: AMOUNT_DEFAULT[currency],
customAmount: 0,
},
+ validateOnBlur: false,
validate: ({ amount, customAmount }) =>
_pickBy({
amount: validateDonationAmount(customAmount || amount, balance, lang),
diff --git a/src/components/Forms/PaymentForm/Payout/Confirm.tsx b/src/components/Forms/PaymentForm/Payout/Confirm.tsx
index 095697f48f..15afcf34f9 100644
--- a/src/components/Forms/PaymentForm/Payout/Confirm.tsx
+++ b/src/components/Forms/PaymentForm/Payout/Confirm.tsx
@@ -76,6 +76,7 @@ const BaseConfirm: React.FC = ({
amount: PAYMENT_MINIMAL_PAYOUT_AMOUNT.HKD,
password: '',
},
+ validateOnBlur: false,
validate: ({ amount, password }) =>
_pickBy({
amount: validatePayoutAmount({
diff --git a/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx b/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
index 55f4ad56a7..2b8a0195a3 100644
--- a/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
+++ b/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
@@ -63,6 +63,7 @@ const Confirm: React.FC = ({ codeId, submitCallback }) => {
password: '',
comparedPassword: '',
},
+ validateOnBlur: false,
validate: ({ password, comparedPassword }) => {
const passwordError = validatePaymentPassword(password, lang)
const comparedPasswordError = validateComparedPassword(
diff --git a/src/components/Forms/PaymentForm/ResetPassword/Request.tsx b/src/components/Forms/PaymentForm/ResetPassword/Request.tsx
index b0982ac747..a66c7a396d 100644
--- a/src/components/Forms/PaymentForm/ResetPassword/Request.tsx
+++ b/src/components/Forms/PaymentForm/ResetPassword/Request.tsx
@@ -56,6 +56,7 @@ const Request: React.FC = ({
email: defaultEmail,
code: '',
},
+ validateOnBlur: false,
validate: ({ email, code }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
diff --git a/src/components/Forms/PaymentForm/SetPassword/index.tsx b/src/components/Forms/PaymentForm/SetPassword/index.tsx
index 0b9a110c24..50978fc651 100644
--- a/src/components/Forms/PaymentForm/SetPassword/index.tsx
+++ b/src/components/Forms/PaymentForm/SetPassword/index.tsx
@@ -69,6 +69,7 @@ const PaymentSetPasswordForm: React.FC = ({ submitCallback }) => {
password: '',
comparedPassword: '',
},
+ validateOnBlur: false,
validate: ({ password, comparedPassword }) => {
const passwordError = validatePaymentPassword(password, lang)
const comparedPasswordError = validateComparedPassword(
diff --git a/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx b/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
index f1fad133a0..6c3141738f 100644
--- a/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
+++ b/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
@@ -67,6 +67,7 @@ const Confirm: React.FC = ({
initialValues: {
password: '',
},
+ validateOnBlur: false,
validate: ({ password }) =>
_pickBy({
password: validatePaymentPassword(password, lang),
diff --git a/src/components/Forms/WalletAuthForm/Connect.tsx b/src/components/Forms/WalletAuthForm/Connect.tsx
index bb5921dc93..4a1d62a060 100644
--- a/src/components/Forms/WalletAuthForm/Connect.tsx
+++ b/src/components/Forms/WalletAuthForm/Connect.tsx
@@ -164,6 +164,7 @@ const Connect: React.FC = ({
email: '',
code: '',
},
+ validateOnBlur: false,
validate: ({ tos, email, code }) =>
_pickBy({
tos: isSignUp ? validateToS(tos, lang) : undefined,
diff --git a/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx b/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx
index e9902ac67f..946430acba 100644
--- a/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx
+++ b/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx
@@ -116,6 +116,7 @@ const EditProfileDialogContent: React.FC = ({
displayName: user.displayName || '',
description: user.info.description || '',
},
+ validateOnBlur: false,
validate: ({ displayName, description }) =>
_pickBy({
displayName: validateDisplayName(displayName, lang, isAdmin),
From 84049506607d68aee24ad05b457b8cb5a61ec996 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Tue, 28 Mar 2023 15:32:31 +0800
Subject: [PATCH 25/92] feat(test): revise publishDraft
---
tests/common/publishDraft.ts | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tests/common/publishDraft.ts b/tests/common/publishDraft.ts
index b00258e19b..8b94985be1 100644
--- a/tests/common/publishDraft.ts
+++ b/tests/common/publishDraft.ts
@@ -74,7 +74,9 @@ export const publishDraft = async ({
if (tags && tags.length > 0) {
const articleTags = await articleDetail.getTags()
- expect(articleTags.sort().join(',')).toBe(tags.sort().join(','))
+ expect(articleTags.sort().join(',')).toBe(
+ '#,'.repeat(tags.length) + tags.sort().join(',')
+ )
}
if (collectedArticleTitle) {
From 45c13a2b44eee44be5fc09f1e1c5a7a6c90d312d Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Tue, 28 Mar 2023 15:34:04 +0800
Subject: [PATCH 26/92] feat(test): revise draftDetail
---
src/common/enums/test.ts | 3 +++
.../Forms/EditorSearchSelectForm/index.tsx | 2 ++
tests/helpers/poms/draftDetail.ts | 14 ++++++++++----
3 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/src/common/enums/test.ts b/src/common/enums/test.ts
index b840be1f91..1de16df3ce 100644
--- a/src/common/enums/test.ts
+++ b/src/common/enums/test.ts
@@ -84,6 +84,9 @@ export enum TEST_ID {
USER_PROFILE_FOLLOWERS_COUNT = 'user-profile/followers/count',
USER_PROFILE_BIO = 'user-profile/bio',
+ // Editor
+ EDITOR_SEARCH_SELECT_FORM_DIALOG_ADD_BUTTON = 'editor/search-select-form/dialog/add-button',
+
// misc
SPINNER = 'spinner',
}
diff --git a/src/components/Forms/EditorSearchSelectForm/index.tsx b/src/components/Forms/EditorSearchSelectForm/index.tsx
index 68dfba80da..b3c28c5dc4 100644
--- a/src/components/Forms/EditorSearchSelectForm/index.tsx
+++ b/src/components/Forms/EditorSearchSelectForm/index.tsx
@@ -3,6 +3,7 @@ import { useEffect, useState } from 'react'
import {
MAX_ARTICLE_COLLECT_LENGTH,
MAX_ARTICLE_TAG_LENGTH,
+ TEST_ID,
TextId,
} from '~/common/enums'
import { Dialog, IconAdd16, TextIcon, Translate } from '~/components'
@@ -147,6 +148,7 @@ const EditorSearchSelectForm = ({
className="stagingHeadArea"
onClick={toSearchingArea}
disabled={!enableAdd}
+ data-test-id={TEST_ID.EDITOR_SEARCH_SELECT_FORM_DIALOG_ADD_BUTTON}
>
}
diff --git a/tests/helpers/poms/draftDetail.ts b/tests/helpers/poms/draftDetail.ts
index d1fdd985a4..032aa1043a 100644
--- a/tests/helpers/poms/draftDetail.ts
+++ b/tests/helpers/poms/draftDetail.ts
@@ -42,6 +42,7 @@ export class DraftDetailPage {
// dialog
readonly dialog: Locator
+ readonly dialogAddButton: Locator
readonly dialogPublishNowButton: Locator
readonly dialogPublishButton: Locator
readonly dialogViewArticleButton: Locator
@@ -86,6 +87,9 @@ export class DraftDetailPage {
// dialog
this.dialog = this.page.getByRole('dialog')
+ this.dialogAddButton = this.page.getByTestId(
+ TEST_ID.EDITOR_SEARCH_SELECT_FORM_DIALOG_ADD_BUTTON
+ )
this.dialogPublishNowButton = this.dialog.getByRole('button', {
name: 'Publish Now',
})
@@ -147,11 +151,12 @@ export class DraftDetailPage {
const tags = _uniq(generateTags({ count: 3 }))
for (const tag of tags) {
- await this.page.getByPlaceholder('Search tags...').fill(tag)
+ await this.dialogAddButton.click()
+ await this.page.getByPlaceholder('Search tags').fill(tag)
await this.page.getByTestId(TEST_ID.SEARCH_RESULTS_ITEM).first().click()
}
- await this.dialogSaveButton.click()
+ await this.dialogDoneButton.click()
return tags
}
@@ -217,10 +222,11 @@ export class DraftDetailPage {
async setCollection() {
await this.barCollectArticle.click()
+ await this.dialogAddButton.click()
// type and search
const searchKey = 'test'
- await this.page.getByPlaceholder('Search articles...').fill(searchKey)
+ await this.page.getByPlaceholder('Search articles').fill(searchKey)
await waitForAPIResponse({
page: this.page,
@@ -237,7 +243,7 @@ export class DraftDetailPage {
}
// save
- await this.dialogSaveButton.click()
+ await this.dialogDoneButton.click()
return articleTitle
}
From 5c09bc4471920ffc969b4a5e576843d0cc04eebb Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Wed, 29 Mar 2023 12:48:49 +0800
Subject: [PATCH 27/92] fix(Editor): use EditorSearchSelectForm
---
src/components/Editor/SettingsDialog/index.tsx | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/components/Editor/SettingsDialog/index.tsx b/src/components/Editor/SettingsDialog/index.tsx
index 4e6fe0dbbc..ecdd4538eb 100644
--- a/src/components/Editor/SettingsDialog/index.tsx
+++ b/src/components/Editor/SettingsDialog/index.tsx
@@ -16,6 +16,7 @@ import {
SearchExclude,
} from '~/gql/graphql'
+import ArticleCustomStagingArea from '../ArticleCustomStagingArea'
import TagCustomStagingArea from '../TagCustomStagingArea'
import SettingsList, { SettingsListDialogButtons } from './List'
@@ -47,8 +48,8 @@ export type EditorSettingsDialogProps = {
SetPublishISCNProps &
SettingsListDialogButtons
-const DynamicSearchSelectForm = dynamic(
- () => import('~/components/Forms/SearchSelectForm'),
+const DynamicEditorSearchSelectForm = dynamic(
+ () => import('~/components/Forms/EditorSearchSelectForm'),
{ loading: Spinner }
)
@@ -188,7 +189,7 @@ const BaseEditorSettingsDialog = ({
)}
{isCollection && (
-
)}
{isTag && (
-
Date: Wed, 29 Mar 2023 15:51:25 +0700
Subject: [PATCH 28/92] feat(form): make tabIndex
to -1
---
src/components/Forms/EmailLoginForm/Buttons.tsx | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/components/Forms/EmailLoginForm/Buttons.tsx b/src/components/Forms/EmailLoginForm/Buttons.tsx
index 76f704dd78..8a49bc0f35 100644
--- a/src/components/Forms/EmailLoginForm/Buttons.tsx
+++ b/src/components/Forms/EmailLoginForm/Buttons.tsx
@@ -16,7 +16,6 @@ export const PasswordResetDialogButton = ({
tabIndex={-1}
>
- {' '}
(
-
+
Date: Wed, 29 Mar 2023 16:26:43 +0700
Subject: [PATCH 29/92] feat(form): disable validateOnChange
---
.../Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx | 1 +
src/components/Dialogs/TagDialog/Content.tsx | 4 ++--
.../Editor/ToggleAccess/SupportSettingDialog/Content.tsx | 1 +
src/components/Forms/ChangeEmailForm/Confirm.tsx | 4 ++--
src/components/Forms/ChangeEmailForm/Request.tsx | 4 ++--
src/components/Forms/ChangePasswordForm/Confirm.tsx | 4 ++--
src/components/Forms/ChangePasswordForm/Request.tsx | 4 ++--
src/components/Forms/ChangeUserNameForm/Confirm.tsx | 4 ++--
src/components/Forms/CreateCircleForm/Init.tsx | 4 ++--
src/components/Forms/CreateCircleForm/Profile.tsx | 4 ++--
src/components/Forms/EmailLoginForm/index.tsx | 4 ++--
src/components/Forms/EmailSignUpForm/Init.tsx | 4 ++--
src/components/Forms/EmailSignUpForm/Password.tsx | 4 ++--
src/components/Forms/PaymentForm/AddCredit/index.tsx | 1 +
src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx | 1 +
src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx | 1 +
src/components/Forms/PaymentForm/Payout/Confirm.tsx | 4 ++--
src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx | 1 +
src/components/Forms/PaymentForm/ResetPassword/Request.tsx | 4 ++--
src/components/Forms/PaymentForm/SetPassword/index.tsx | 1 +
.../Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx | 1 +
src/components/Forms/WalletAuthForm/Connect.tsx | 1 +
.../UserProfile/DropdownActions/EditProfileDialog/Content.tsx | 4 ++--
23 files changed, 37 insertions(+), 28 deletions(-)
diff --git a/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx b/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx
index 4ea0d7e25d..de3cde5514 100644
--- a/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx
+++ b/src/components/Dialogs/PaymentPointerDialog/SetPaymentPointerForm.tsx
@@ -69,6 +69,7 @@ const SetPaymentPointerForm: React.FC = ({
paymentPointer: defaultPaymentPointer,
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ paymentPointer }) =>
_pickBy({
paymentPointer: validatePaymentPointer(paymentPointer, lang),
diff --git a/src/components/Dialogs/TagDialog/Content.tsx b/src/components/Dialogs/TagDialog/Content.tsx
index 06a744fba9..d23fc19bd6 100644
--- a/src/components/Dialogs/TagDialog/Content.tsx
+++ b/src/components/Dialogs/TagDialog/Content.tsx
@@ -98,7 +98,6 @@ const TagDialogContent: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
setFieldValue,
} = useFormik({
initialValues: {
@@ -107,6 +106,7 @@ const TagDialogContent: React.FC = ({
newDescription: description || '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ newContent }) =>
_pickBy({
newContent: validateTagName(newContent, lang),
@@ -229,7 +229,7 @@ const TagDialogContent: React.FC = ({
text={}
type="submit"
form={formId}
- disabled={!isValid || isSubmitting}
+ disabled={isSubmitting}
loading={isSubmitting}
/>
)
diff --git a/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx b/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx
index 7f798c24fb..12e531f81b 100644
--- a/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx
+++ b/src/components/Editor/ToggleAccess/SupportSettingDialog/Content.tsx
@@ -68,6 +68,7 @@ const SupportSettingDialogContent: React.FC = ({
replyToDonator: content?.replyToDonator ? content.replyToDonator : '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ requestForDonation, replyToDonator }) =>
_pickBy({
requestForDonation: validateSupportWords(requestForDonation!, lang),
diff --git a/src/components/Forms/ChangeEmailForm/Confirm.tsx b/src/components/Forms/ChangeEmailForm/Confirm.tsx
index f89efebfe1..1ffdef179f 100644
--- a/src/components/Forms/ChangeEmailForm/Confirm.tsx
+++ b/src/components/Forms/ChangeEmailForm/Confirm.tsx
@@ -68,13 +68,13 @@ const Confirm: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
email: '',
code: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ email, code }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: false }),
@@ -159,7 +159,7 @@ const Confirm: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/ChangeEmailForm/Request.tsx b/src/components/Forms/ChangeEmailForm/Request.tsx
index 5ce743da1a..b687b582cc 100644
--- a/src/components/Forms/ChangeEmailForm/Request.tsx
+++ b/src/components/Forms/ChangeEmailForm/Request.tsx
@@ -52,13 +52,13 @@ const Request: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
email: defaultEmail,
code: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ email, code }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
@@ -131,7 +131,7 @@ const Request: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/ChangePasswordForm/Confirm.tsx b/src/components/Forms/ChangePasswordForm/Confirm.tsx
index ca954a2779..e28d765bd3 100644
--- a/src/components/Forms/ChangePasswordForm/Confirm.tsx
+++ b/src/components/Forms/ChangePasswordForm/Confirm.tsx
@@ -78,13 +78,13 @@ const Confirm: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
password: '',
comparedPassword: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ password, comparedPassword }) =>
_pickBy({
password: validatePassword(password, lang),
@@ -156,7 +156,7 @@ const Confirm: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/ChangePasswordForm/Request.tsx b/src/components/Forms/ChangePasswordForm/Request.tsx
index 07656dd7d5..b824e60215 100644
--- a/src/components/Forms/ChangePasswordForm/Request.tsx
+++ b/src/components/Forms/ChangePasswordForm/Request.tsx
@@ -59,12 +59,12 @@ const Request: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
email: defaultEmail,
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ email }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
@@ -114,7 +114,7 @@ const Request: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/ChangeUserNameForm/Confirm.tsx b/src/components/Forms/ChangeUserNameForm/Confirm.tsx
index e6f01b89a7..8f7b2ff285 100644
--- a/src/components/Forms/ChangeUserNameForm/Confirm.tsx
+++ b/src/components/Forms/ChangeUserNameForm/Confirm.tsx
@@ -61,13 +61,13 @@ const Confirm: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
userName: '',
comparedUserName: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ userName, comparedUserName }) =>
_pickBy({
userName: validateUserName(userName, lang),
@@ -152,7 +152,7 @@ const Confirm: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/CreateCircleForm/Init.tsx b/src/components/Forms/CreateCircleForm/Init.tsx
index 01eb16aacd..d10990a4ce 100644
--- a/src/components/Forms/CreateCircleForm/Init.tsx
+++ b/src/components/Forms/CreateCircleForm/Init.tsx
@@ -63,7 +63,6 @@ const Init: React.FC = ({
handleSubmit,
setFieldValue,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
name: '',
@@ -71,6 +70,7 @@ const Init: React.FC = ({
amount: PAYMENT_MINIMAL_CIRCLE_AMOUNT.HKD,
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ name, displayName, amount }) =>
_pickBy({
name: validateCircleName(name, lang),
@@ -211,7 +211,7 @@ const Init: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/CreateCircleForm/Profile.tsx b/src/components/Forms/CreateCircleForm/Profile.tsx
index ca06e105e0..93f363361a 100644
--- a/src/components/Forms/CreateCircleForm/Profile.tsx
+++ b/src/components/Forms/CreateCircleForm/Profile.tsx
@@ -69,7 +69,6 @@ const Init: React.FC = ({ circle, type, purpose, closeDialog }) => {
handleChange,
handleSubmit,
isSubmitting,
- isValid,
setFieldValue,
} = useFormik({
initialValues: {
@@ -79,6 +78,7 @@ const Init: React.FC = ({ circle, type, purpose, closeDialog }) => {
description: circle.description || '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ displayName, description }) =>
_pickBy({
displayName: !isCreate
@@ -227,7 +227,7 @@ const Init: React.FC = ({ circle, type, purpose, closeDialog }) => {
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/EmailLoginForm/index.tsx b/src/components/Forms/EmailLoginForm/index.tsx
index 8694185c88..410bf43734 100644
--- a/src/components/Forms/EmailLoginForm/index.tsx
+++ b/src/components/Forms/EmailLoginForm/index.tsx
@@ -94,7 +94,6 @@ export const EmailLoginForm: React.FC = ({
handleBlur,
handleChange,
handleSubmit,
- isValid,
isSubmitting,
} = useFormik({
initialValues: {
@@ -102,6 +101,7 @@ export const EmailLoginForm: React.FC = ({
password: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ email, password }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
@@ -213,7 +213,7 @@ export const EmailLoginForm: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/EmailSignUpForm/Init.tsx b/src/components/Forms/EmailSignUpForm/Init.tsx
index 0d90cf5572..ed05ffcc10 100644
--- a/src/components/Forms/EmailSignUpForm/Init.tsx
+++ b/src/components/Forms/EmailSignUpForm/Init.tsx
@@ -68,7 +68,6 @@ const Init: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
displayName: '',
@@ -76,6 +75,7 @@ const Init: React.FC = ({
tos: true,
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ displayName, email, tos }) =>
_pickBy({
displayName: validateDisplayName(displayName, lang),
@@ -179,7 +179,7 @@ const Init: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/EmailSignUpForm/Password.tsx b/src/components/Forms/EmailSignUpForm/Password.tsx
index c6c245fa65..265ae885cb 100644
--- a/src/components/Forms/EmailSignUpForm/Password.tsx
+++ b/src/components/Forms/EmailSignUpForm/Password.tsx
@@ -96,13 +96,13 @@ const Password: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
password: '',
comparedPassword: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ password, comparedPassword }) =>
_pickBy({
password: validatePassword(password, lang),
@@ -206,7 +206,7 @@ const Password: React.FC = ({
}
loading={isSubmitting}
/>
diff --git a/src/components/Forms/PaymentForm/AddCredit/index.tsx b/src/components/Forms/PaymentForm/AddCredit/index.tsx
index 1cbb4568fe..406e937185 100644
--- a/src/components/Forms/PaymentForm/AddCredit/index.tsx
+++ b/src/components/Forms/PaymentForm/AddCredit/index.tsx
@@ -123,6 +123,7 @@ const BaseAddCredit: React.FC = ({
amount: defaultAmount || PAYMENT_DEFAULT_ADD_CREDIT_AMOUNT[currency],
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ amount }) =>
_pickBy({
amount: validateAmount(amount, lang),
diff --git a/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx b/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
index 44967fb3d4..4235381e1c 100644
--- a/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
+++ b/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
@@ -112,6 +112,7 @@ const Confirm: React.FC = ({
password: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ password }) =>
_pickBy({
password: validatePaymentPassword(password, lang),
diff --git a/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx b/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx
index c6c23dc409..3c12f67501 100644
--- a/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx
+++ b/src/components/Forms/PaymentForm/PayTo/SetAmount/index.tsx
@@ -178,6 +178,7 @@ const SetAmount: React.FC = ({
customAmount: 0,
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ amount, customAmount }) =>
_pickBy({
amount: validateDonationAmount(customAmount || amount, balance, lang),
diff --git a/src/components/Forms/PaymentForm/Payout/Confirm.tsx b/src/components/Forms/PaymentForm/Payout/Confirm.tsx
index 15afcf34f9..f8dfb4e9db 100644
--- a/src/components/Forms/PaymentForm/Payout/Confirm.tsx
+++ b/src/components/Forms/PaymentForm/Payout/Confirm.tsx
@@ -64,7 +64,6 @@ const BaseConfirm: React.FC = ({
errors,
handleBlur,
handleSubmit,
- isValid,
isSubmitting,
setFieldError,
setFieldValue,
@@ -77,6 +76,7 @@ const BaseConfirm: React.FC = ({
password: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ amount, password }) =>
_pickBy({
amount: validatePayoutAmount({
@@ -238,7 +238,7 @@ const BaseConfirm: React.FC = ({
diff --git a/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx b/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
index 2b8a0195a3..460ae2ecb9 100644
--- a/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
+++ b/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
@@ -64,6 +64,7 @@ const Confirm: React.FC = ({ codeId, submitCallback }) => {
comparedPassword: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ password, comparedPassword }) => {
const passwordError = validatePaymentPassword(password, lang)
const comparedPasswordError = validateComparedPassword(
diff --git a/src/components/Forms/PaymentForm/ResetPassword/Request.tsx b/src/components/Forms/PaymentForm/ResetPassword/Request.tsx
index a66c7a396d..19b28fc906 100644
--- a/src/components/Forms/PaymentForm/ResetPassword/Request.tsx
+++ b/src/components/Forms/PaymentForm/ResetPassword/Request.tsx
@@ -50,13 +50,13 @@ const Request: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
email: defaultEmail,
code: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ email, code }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
@@ -137,7 +137,7 @@ const Request: React.FC = ({
diff --git a/src/components/Forms/PaymentForm/SetPassword/index.tsx b/src/components/Forms/PaymentForm/SetPassword/index.tsx
index 50978fc651..c66d5c2c84 100644
--- a/src/components/Forms/PaymentForm/SetPassword/index.tsx
+++ b/src/components/Forms/PaymentForm/SetPassword/index.tsx
@@ -70,6 +70,7 @@ const PaymentSetPasswordForm: React.FC = ({ submitCallback }) => {
comparedPassword: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ password, comparedPassword }) => {
const passwordError = validatePaymentPassword(password, lang)
const comparedPasswordError = validateComparedPassword(
diff --git a/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx b/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
index 6c3141738f..6ca95a72a2 100644
--- a/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
+++ b/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
@@ -68,6 +68,7 @@ const Confirm: React.FC = ({
password: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ password }) =>
_pickBy({
password: validatePaymentPassword(password, lang),
diff --git a/src/components/Forms/WalletAuthForm/Connect.tsx b/src/components/Forms/WalletAuthForm/Connect.tsx
index 4a1d62a060..45aca8a644 100644
--- a/src/components/Forms/WalletAuthForm/Connect.tsx
+++ b/src/components/Forms/WalletAuthForm/Connect.tsx
@@ -165,6 +165,7 @@ const Connect: React.FC = ({
code: '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ tos, email, code }) =>
_pickBy({
tos: isSignUp ? validateToS(tos, lang) : undefined,
diff --git a/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx b/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx
index 946430acba..ccc926be6a 100644
--- a/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx
+++ b/src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx
@@ -107,7 +107,6 @@ const EditProfileDialogContent: React.FC = ({
handleChange,
handleSubmit,
isSubmitting,
- isValid,
setFieldValue,
} = useFormik({
initialValues: {
@@ -117,6 +116,7 @@ const EditProfileDialogContent: React.FC = ({
description: user.info.description || '',
},
validateOnBlur: false,
+ validateOnChange: false,
validate: ({ displayName, description }) =>
_pickBy({
displayName: validateDisplayName(displayName, lang, isAdmin),
@@ -265,7 +265,7 @@ const EditProfileDialogContent: React.FC = ({
}
loading={isSubmitting}
/>
From c998bf0439df25a7d89b542bac1e0364b82287ec Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Wed, 29 Mar 2023 17:05:05 +0700
Subject: [PATCH 30/92] feat(form): skip validate password for login form
---
src/components/Forms/EmailLoginForm/index.tsx | 4 ++--
src/components/Forms/EmailSignUpForm/Init.tsx | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/components/Forms/EmailLoginForm/index.tsx b/src/components/Forms/EmailLoginForm/index.tsx
index 410bf43734..cd34f5606e 100644
--- a/src/components/Forms/EmailLoginForm/index.tsx
+++ b/src/components/Forms/EmailLoginForm/index.tsx
@@ -16,7 +16,7 @@ import {
redirectToTarget,
setCookies,
validateEmail,
- validatePassword,
+ // validatePassword,
} from '~/common/utils'
import {
Dialog,
@@ -105,7 +105,7 @@ export const EmailLoginForm: React.FC = ({
validate: ({ email, password }) =>
_pickBy({
email: validateEmail(email, lang, { allowPlusSign: true }),
- password: validatePassword(password, lang),
+ // password: validatePassword(password, lang),
}),
onSubmit: async ({ email, password }, { setFieldError, setSubmitting }) => {
try {
diff --git a/src/components/Forms/EmailSignUpForm/Init.tsx b/src/components/Forms/EmailSignUpForm/Init.tsx
index ed05ffcc10..d5586e6420 100644
--- a/src/components/Forms/EmailSignUpForm/Init.tsx
+++ b/src/components/Forms/EmailSignUpForm/Init.tsx
@@ -75,7 +75,7 @@ const Init: React.FC = ({
tos: true,
},
validateOnBlur: false,
- validateOnChange: false,
+ validateOnChange: true, // enable for signup form
validate: ({ displayName, email, tos }) =>
_pickBy({
displayName: validateDisplayName(displayName, lang),
From f1d57d4b226dacc6901bb53b262cfe25b9017f5a Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Wed, 29 Mar 2023 17:57:56 +0700
Subject: [PATCH 31/92] fix(form): fix cannot switch to sign up on login form
---
src/components/Form/List/Item/index.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/components/Form/List/Item/index.tsx b/src/components/Form/List/Item/index.tsx
index e355664f4d..c6b70381cb 100644
--- a/src/components/Form/List/Item/index.tsx
+++ b/src/components/Form/List/Item/index.tsx
@@ -50,7 +50,7 @@ const Item: React.FC = forwardRef(
top: leftAlign === 'top',
bold: !!bold,
})
- const ItemContent = () => (
+ const itemContent = (
{title}
@@ -90,7 +90,7 @@ const Item: React.FC = forwardRef(
spacing={cardProps.spacing || [0, 0]}
ref={ref}
>
-
+ {itemContent}
@@ -100,7 +100,7 @@ const Item: React.FC = forwardRef(
spacing={cardProps.spacing || [0, 0]}
ref={ref}
>
-
+ {itemContent}
>
From a2a2ef22d8171866f0e1419dc89e6b65de2242f7 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Wed, 29 Mar 2023 22:06:26 +0700
Subject: [PATCH 32/92] feat(tag): remove "add articles to tag" button
---
.../AddButton/AddMyArticlesButton/index.tsx | 24 ---
.../AddButton/CreateDraftMenuItem/index.tsx | 91 ----------
.../TagDetail/Buttons/AddButton/index.tsx | 162 ------------------
src/views/TagDetail/Buttons/index.tsx | 2 -
src/views/TagDetail/index.tsx | 3 -
5 files changed, 282 deletions(-)
delete mode 100644 src/views/TagDetail/Buttons/AddButton/AddMyArticlesButton/index.tsx
delete mode 100644 src/views/TagDetail/Buttons/AddButton/CreateDraftMenuItem/index.tsx
delete mode 100644 src/views/TagDetail/Buttons/AddButton/index.tsx
diff --git a/src/views/TagDetail/Buttons/AddButton/AddMyArticlesButton/index.tsx b/src/views/TagDetail/Buttons/AddButton/AddMyArticlesButton/index.tsx
deleted file mode 100644
index 6a82bb7b40..0000000000
--- a/src/views/TagDetail/Buttons/AddButton/AddMyArticlesButton/index.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { FormattedMessage } from 'react-intl'
-
-import { IconHashTag16, Menu, TextIcon } from '~/components'
-
-interface AddMyArticlesButtonProps {
- onClick: () => void
-}
-
-const AddMyArticlesButton: React.FC = ({
- onClick,
-}) => {
- return (
-
- } size="md" spacing="base">
-
-
-
- )
-}
-
-export default AddMyArticlesButton
diff --git a/src/views/TagDetail/Buttons/AddButton/CreateDraftMenuItem/index.tsx b/src/views/TagDetail/Buttons/AddButton/CreateDraftMenuItem/index.tsx
deleted file mode 100644
index 4dc72d9db8..0000000000
--- a/src/views/TagDetail/Buttons/AddButton/CreateDraftMenuItem/index.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import { useRouter } from 'next/router'
-import { useContext } from 'react'
-import { FormattedMessage, useIntl } from 'react-intl'
-
-import { ADD_TOAST, OPEN_LIKE_COIN_DIALOG } from '~/common/enums'
-import { analytics, toPath } from '~/common/utils'
-import {
- IconAdd24,
- Menu,
- TextIcon,
- useMutation,
- ViewerContext,
-} from '~/components'
-import CREATE_DRAFT from '~/components/GQL/mutations/createDraft'
-import { CreateDraftMutation, TagFragmentFragment } from '~/gql/graphql'
-
-interface CreateDraftButtonProps {
- tag: TagFragmentFragment
-}
-
-const BaseCreateDraftButton = ({ onClick }: { onClick: () => any }) => (
-
- } size="md" spacing="base">
-
-
-
-)
-
-const CreateDraftButton: React.FC = ({ tag }) => {
- const router = useRouter()
- const viewer = useContext(ViewerContext)
-
- const intl = useIntl()
- const [putDraft] = useMutation(CREATE_DRAFT, {
- variables: {
- title: intl.formatMessage({
- defaultMessage: 'Untitled',
- description: '',
- }),
- tags: [tag.content],
- },
- })
-
- const createDraft = async () => {
- if (viewer.isInactive) {
- window.dispatchEvent(
- new CustomEvent(ADD_TOAST, {
- detail: {
- color: 'red',
- content: (
-
- ),
- },
- })
- )
- return
- }
-
- analytics.trackEvent('click_button', {
- type: 'write',
- })
-
- const result = await putDraft()
- const { slug, id } = result?.data?.putDraft || {}
-
- if (slug && id) {
- const path = toPath({ page: 'draftDetail', slug, id })
- router.push(path.href)
- }
- }
-
- if (viewer.shouldSetupLikerID) {
- return (
-
- window.dispatchEvent(new CustomEvent(OPEN_LIKE_COIN_DIALOG, {}))
- }
- />
- )
- }
-
- return
-}
-
-export default CreateDraftButton
diff --git a/src/views/TagDetail/Buttons/AddButton/index.tsx b/src/views/TagDetail/Buttons/AddButton/index.tsx
deleted file mode 100644
index cc7e225828..0000000000
--- a/src/views/TagDetail/Buttons/AddButton/index.tsx
+++ /dev/null
@@ -1,162 +0,0 @@
-import { useContext } from 'react'
-
-import { ADD_TOAST, REFETCH_TAG_DETAIL_ARTICLES } from '~/common/enums'
-import { translate } from '~/common/utils'
-import {
- Button,
- DropdownDialog,
- IconPen16,
- LanguageContext,
- Menu,
- TextIcon,
- Translate,
- useMutation,
- ViewerContext,
-} from '~/components'
-import { SearchSelectDialog } from '~/components/Dialogs/SearchSelectDialog'
-import { SearchSelectNode } from '~/components/Forms/SearchSelectForm'
-import ADD_ARTICLES_TAGS from '~/components/GQL/mutations/addArticlesTags'
-import updateTagArticlesCount from '~/components/GQL/updates/tagArticlesCount'
-import { AddArticlesTagsMutation, TagFragmentFragment } from '~/gql/graphql'
-
-import AddMyArticlesButton from './AddMyArticlesButton'
-import CreateDraftMenuItem from './CreateDraftMenuItem'
-
-interface DropdownActionsProps {
- tag: TagFragmentFragment
-}
-
-interface DialogProps {
- openAddMyArticlesDialog: () => void
-}
-
-type BaseDropdownActionsProps = DropdownActionsProps & DialogProps
-
-const BaseDropdownActions = ({
- tag,
- openAddMyArticlesDialog,
-}: BaseDropdownActionsProps) => {
- const Content = ({ isInDropdown }: { isInDropdown?: boolean }) => (
-
- )
-
- return (
- ,
- placement: 'bottom-end',
- }}
- dialog={{
- content: ,
- title: 'moreActions',
- }}
- >
- {({ openDialog, type, ref }) => (
-
- } weight="md" size="md-s">
-
-
-
- )}
-
- )
-}
-
-const DropdownActions = (props: DropdownActionsProps) => {
- const viewer = useContext(ViewerContext)
- const { lang } = useContext(LanguageContext)
- const { tag } = props
-
- /**
- * Data
- */
- const [add, { loading }] =
- useMutation(ADD_ARTICLES_TAGS)
- const addArticlesToTag =
- (selected: boolean) => async (articles: SearchSelectNode[]) => {
- const articleIds = articles.map((article) => article.id)
-
- await add({
- variables: { id: tag.id, articles: articleIds, selected },
- update: (cache, { data }) => {
- if (selected) {
- const newCount = data?.addArticlesTags?.articles?.totalCount || 0
- const oldCount = tag.articles.totalCount || 0
- updateTagArticlesCount({
- cache,
- id: tag.id,
- count: newCount - oldCount,
- type: 'increment',
- })
- }
- },
- })
-
- window.dispatchEvent(
- new CustomEvent(ADD_TOAST, {
- detail: {
- color: 'green',
- content: translate({ id: 'addedArticleTag', lang }),
- duration: 2000,
- },
- })
- )
-
- window.dispatchEvent(
- new CustomEvent(REFETCH_TAG_DETAIL_ARTICLES, {
- detail: {
- event: 'add',
- differences: articles.length,
- },
- })
- )
- }
-
- const forbid = () => {
- window.dispatchEvent(
- new CustomEvent(ADD_TOAST, {
- detail: {
- color: 'red',
- content: ,
- },
- })
- )
- return
- }
-
- /**
- * Render
- */
- return (
-
- {({ openDialog }) => (
-
- )}
-
- )
-}
-
-export default DropdownActions
diff --git a/src/views/TagDetail/Buttons/index.tsx b/src/views/TagDetail/Buttons/index.tsx
index 7c8d964ce8..cd045c6a17 100644
--- a/src/views/TagDetail/Buttons/index.tsx
+++ b/src/views/TagDetail/Buttons/index.tsx
@@ -1,7 +1,5 @@
-import AddButton from './AddButton'
import FollowButton from './FollowButton'
export const TagDetailButtons = {
- AddButton,
FollowButton,
}
diff --git a/src/views/TagDetail/index.tsx b/src/views/TagDetail/index.tsx
index a79e50304f..63dda8971e 100644
--- a/src/views/TagDetail/index.tsx
+++ b/src/views/TagDetail/index.tsx
@@ -112,8 +112,6 @@ const TagDetail = ({ tag }: { tag: TagFragmentFragment }) => {
const isEditor = (tag?.editors || []).some((t) => t.id === viewer.id)
const isMatty = viewer.info.email === 'hi@matters.news'
const isMaintainer = isOwner || isEditor || isMatty
- const isOfficial = !!tag?.isOfficial
- const canAdd = !isOfficial || (isOfficial && isMatty)
const title =
// (tag.description ? `${makeTitle(tag.description, 80)} ` : '') +
@@ -196,7 +194,6 @@ const TagDetail = ({ tag }: { tag: TagFragmentFragment }) => {
)}
From e81933fadee8fab5fb155001dc1b351d1f7dc0b8 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Thu, 30 Mar 2023 12:57:35 +0700
Subject: [PATCH 33/92] feat(username): lowercase letters and strip
non-underline chars on type user name or circle name
---
lang/default.json | 8 +-
lang/en.json | 2 +-
lang/zh-Hans.json | 2 +-
lang/zh-Hant.json | 2 +-
src/common/enums/text.ts | 19 ++--
src/common/utils/route.ts | 4 +-
src/common/utils/{text.ts => text/article.ts} | 89 ++++---------------
src/common/utils/text/index.ts | 22 +++++
src/common/utils/text/tag.ts | 47 ++++++++++
src/components/ArticleDigest/Card/index.tsx | 8 +-
src/components/Dialogs/HelpDialog/index.tsx | 15 +++-
src/components/Dialogs/TagDialog/Content.tsx | 4 +-
.../Forms/ChangeUserNameForm/Confirm.tsx | 15 +++-
.../Forms/CreateCircleForm/Init.tsx | 9 +-
.../SearchSelect/SearchingArea/index.tsx | 8 +-
src/components/Tag/index.tsx | 4 +-
src/components/UserDigest/Plain/index.tsx | 9 +-
src/views/ArticleDetail/Toolbar/index.tsx | 4 +-
src/views/ArticleDetail/index.tsx | 6 +-
src/views/TagDetail/index.tsx | 16 ++--
20 files changed, 157 insertions(+), 136 deletions(-)
rename src/common/utils/{text.ts => text/article.ts} (51%)
create mode 100644 src/common/utils/text/index.ts
create mode 100644 src/common/utils/text/tag.ts
diff --git a/lang/default.json b/lang/default.json
index ad3125a28d..7d6ff9a47c 100644
--- a/lang/default.json
+++ b/lang/default.json
@@ -259,6 +259,10 @@
"defaultMessage": ". Take a look at your income",
"description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
+ "CBDDR5": {
+ "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
+ "description": ""
+ },
"Cdkhl8": {
"defaultMessage": "Delete {commentType}",
"description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
@@ -863,10 +867,6 @@
"defaultMessage": "posted and replied to topics",
"description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "gMZZ9I": {
- "defaultMessage": "Must be between 2-20 characters long. Only letters, numbers and underscores are allowed.",
- "description": ""
- },
"gMZfHO": {
"defaultMessage": "RSS Subscription",
"description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
diff --git a/lang/en.json b/lang/en.json
index fda640be9f..fcd3cd9433 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -1115,7 +1115,7 @@
"description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
"gMZZ9I": {
- "defaultMessage": "Must be between 2-20 characters long. Only letters, numbers and underscores are allowed.",
+ "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
"description": ""
},
"+7SAix": {
diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json
index 1ef62673d4..bc9fb68360 100644
--- a/lang/zh-Hans.json
+++ b/lang/zh-Hans.json
@@ -1115,7 +1115,7 @@
"description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
"gMZZ9I": {
- "defaultMessage": "2-20 个字符,仅支持英文、数字或下划线",
+ "defaultMessage": "2-20 个字符,仅支持英文小写字母、数字或下划线",
"description": ""
},
"+7SAix": {
diff --git a/lang/zh-Hant.json b/lang/zh-Hant.json
index 569ce30535..e45ba2ce67 100644
--- a/lang/zh-Hant.json
+++ b/lang/zh-Hant.json
@@ -1115,7 +1115,7 @@
"description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
"gMZZ9I": {
- "defaultMessage": "2-20 個字元,僅支持英文、數字或下劃線",
+ "defaultMessage": "2-20 個字元,僅支持英文小寫字母、數字或下劃線",
"description": ""
},
"+7SAix": {
diff --git a/src/common/enums/text.ts b/src/common/enums/text.ts
index 4d7811ef1e..aee6645625 100644
--- a/src/common/enums/text.ts
+++ b/src/common/enums/text.ts
@@ -161,11 +161,11 @@ export const TEXT = {
hintAddTagNoTag: '目前尚無標籤,立即添加提高作品曝光度!',
hintAddTagShort: '添加合適標籤,讓站內外讀者找到你的作品',
hintAddTagNamingRestriction:
- '標籤名稱不允許標點符號,字間僅允許一個不連續空白,最大長度50字元',
+ '標籤名稱不允許標點符號,字間僅允許一個不連續空白,最大長度 50 字元',
hintAddCircleInvitee: '添加站內或站外朋友加入圍爐',
hintCircleAddArticles: '將公開作品加入圍爐,成為永久收費作品。',
hintCircleDisplayName: '2-12 個字元',
- hintCircleName: '2-20 個字元,僅支持英文、數字或下劃線',
+ hintCircleName: '2-20 個字元,僅支持英文小写字母、數字或下劃線',
hintDescription: '建議 50 字以內,最長 200 字',
hintDisplayName: '2-20 個字元',
hintEditCollection: '關聯自己或他人的作品,幫助讀者更好地發現內容。',
@@ -173,7 +173,7 @@ export const TEXT = {
hintPaymentPassword: '輸入六位數字交易密碼',
hintPaymentPointer: '錢包地址以“$”開頭',
hintTerm: '我們的用戶協議和隱私政策發生了更改,請閱讀並同意後繼續使用。',
- hintUserName: '4-15 個字元,僅支持英文、數字或下劃線',
+ hintUserName: '4-15 個字元,僅支持英文小写字母、數字或下劃線',
hintVerificationCode: '驗證碼有效期 20 分鐘',
history: '足跡',
hkd: '港幣',
@@ -571,11 +571,11 @@ export const TEXT = {
hintAddTagNoTag: '目前尚无标签,立即添加提高作品曝光度!',
hintAddTagShort: '添加适合标签,帮助读者找到你的作品',
hintAddTagNamingRestriction:
- '标签名称不允许标点符号,字间仅允许一个不连续空白,最大长度50字元',
+ '标签名称不允许标点符号,字间仅允许一个不连续空白,最大长度 50 字元',
hintAddCircleInvitee: '添加站内或站外朋友加入围炉',
hintCircleAddArticles: '将公开作品加入围炉,成为永久收费作品。',
hintCircleDisplayName: '2-12 个字符',
- hintCircleName: '2-20 个字符,仅支持英文、数字或下划线',
+ hintCircleName: '2-20 个字符,仅支持英文小写字母、数字或下划线',
hintDescription: '建议 50 字以内,最长 200 字',
hintDisplayName: '2-20 个字符',
hintEditCollection: '关联自己或他人的作品,帮助读者更好地发现内容。',
@@ -583,7 +583,7 @@ export const TEXT = {
hintPaymentPassword: '输入六位数字交易密码',
hintPaymentPointer: '钱包地址以“$”开头',
hintTerm: '我们的用户协议和隐私政策发生了更改,请阅读并同意后继续使用。',
- hintUserName: '4-15 个字符,仅支持英文、数字或下划线',
+ hintUserName: '4-15 个字符,仅支持英文小写字母、数字或下划线',
hintVerificationCode: '验证码有效期 20 分钟',
history: '足迹',
hkd: '港币',
@@ -999,10 +999,9 @@ export const TEXT = {
'Add articles to Circle and keep them behind the paywall.',
hintCircleDisplayName: 'Must be between 2-12 characters long.',
hintCircleName:
- 'Must be between 2-20 characters long. Only letters, numbers and underscores are allowed.',
+ 'Must be between 2-20 characters long. Only letters letters, numbers and underline are allowed.',
hintDescription: 'Maximum 200 characters.',
- hintDisplayName:
- 'Must be between 2-20 characters long. Chinese characters, letters, numbers and underscores are allowed.',
+ hintDisplayName: 'Must be between 2-20 characters long.',
hintEditCollection:
'Adding articles to a collection helps readers find your articles.',
hintPassword:
@@ -1013,7 +1012,7 @@ export const TEXT = {
'We have amended or modified our Terms and Privacy Policy. Agree and accept all Terms to continue using our Services.',
hintUserDescription: 'Recommended within 50 words and 200 words maximum.',
hintUserName:
- 'Must be between 4-15 characters long. Only English alphabets, numbers and underline are accepted.',
+ 'Must be between 4-15 characters long. Only lowercase letters, numbers and underline are accepted.',
hintVerificationCode: 'Code will expire after 20 minutes',
history: 'History',
hkd: 'HKD',
diff --git a/src/common/utils/route.ts b/src/common/utils/route.ts
index b369dd660c..ebc4b654cb 100644
--- a/src/common/utils/route.ts
+++ b/src/common/utils/route.ts
@@ -5,7 +5,7 @@ import { PATHS, ROUTES } from '~/common/enums'
import { UtmParams } from './analytics'
import { fromGlobalId } from './globalId'
-import { tagSlugify } from './text'
+import { slugifyTag } from './text'
import { parseURL } from './url'
interface ArticleArgs {
@@ -201,7 +201,7 @@ export const toPath = (
case 'tagDetail': {
const { id, slug, content } = args.tag
const { id: numberId } = fromGlobalId(id as string)
- const pathname = `/tags/${numberId}-${slug || tagSlugify(content)}`
+ const pathname = `/tags/${numberId}-${slug || slugifyTag(content)}`
const typeStr = args.feedType ? `?type=${args.feedType}` : ''
return {
href: `${pathname}${typeStr}`,
diff --git a/src/common/utils/text.ts b/src/common/utils/text/article.ts
similarity index 51%
rename from src/common/utils/text.ts
rename to src/common/utils/text/article.ts
index 64749cebf2..640cc883f2 100644
--- a/src/common/utils/text.ts
+++ b/src/common/utils/text/article.ts
@@ -1,12 +1,6 @@
import { distance } from 'fastest-levenshtein'
-import {
- MAX_TAG_CONTENT_LENGTH,
- TAG_CONTENT_CLAMP_LATIN_LETTERS_LENGTH,
- TAG_CONTENT_CLAMP_LENGTH,
-} from '~/common/enums'
-
-import { toSizedImageURL } from './url'
+import { toSizedImageURL } from '../url'
/**
* Remove html tag and merge multiple spaces into one.
@@ -34,7 +28,7 @@ export const makeSummary = (html: string, length = 140) => {
const addition =
el.length + summary.length > length + buffer
- ? `${el.substring(0, length - summary.length)}...`
+ ? `${el.substring(0, length - summary.length)}…`
: el
summary = summary.concat(addition)
@@ -55,20 +49,23 @@ export const trimLineBreaks = (html: string) => {
/**
* Simple words' length counting.
*/
-export const countWordsLength = (text: string) => {
- return text
- ? text.split('').reduce((count, char, index) => {
- return count + (text.charCodeAt(index) < 256 ? 1 : 2)
- }, 0)
- : 0
+export const countChars = (text: string) => {
+ if (!text) {
+ return 0
+ }
+
+ return text.split('').reduce((count, char, index) => {
+ return count + (text.charCodeAt(index) < 256 ? 1 : 2)
+ }, 0)
}
/**
* Simple substring title by words' length counting.
*/
-export const subString = (text: string, limit: number) => {
+export const normalizeArticleTitle = (text: string, limit: number) => {
const buffer = 3
- const length = countWordsLength(text)
+ const length = countChars(text)
+
if (text && length > limit) {
let sum = 0
let lastIndex = 0
@@ -79,8 +76,10 @@ export const subString = (text: string, limit: number) => {
break
}
}
- return text.substring(0, lastIndex) + '...'
+
+ return text.substring(0, lastIndex) + '…'
}
+
return text
}
@@ -134,59 +133,3 @@ export const optimizeEmbed = (content: string) => {
*/
export const measureDiffs = (source: string, target: string) =>
distance(source, target)
-
-// for Twitter and others which do not support non-English in URL
-export const stripNonEnglishUrl = (url: string) => {
- // const frag = url.split('#', 2)?.[1] // anything after '#'
- const hash = url.match(/(#[\x21-\x7e]+)$/)?.[1] ?? ''
- // get the beginning portion of all printable ascii, and must ends with ASCII '\w'
- const turl = url.match(/^[\x21-\x7e]+[A-Za-z0-9]/)?.[0]
- return turl ? `${turl}${hash}` : url // fallback to full url
-}
-
-const nonAlphaNumUni = String.raw`[^\p{Letter}\p{Number}]+`
-const anyNonAlphaNum = new RegExp(nonAlphaNumUni, 'gu')
-
-// to simulate slugify at DB server side
-// https://github.com/thematters/matters-metabase/blob/master/sql/stale-tags-create-table-view.sql#L2-L13
-// might be able to use under more scenarios
-export const tagSlugify = (content: string) =>
- `${content}`
- // .toLowerCase()
- .replace(anyNonAlphaNum, '-') // replace all non alpha-number to `-`, including spaces and punctuations
- .replace(/(^-+|-+$)/g, '') // strip leading or trailing `-` if there's any
-
-export const stripAllPunct = (content: string) => {
- const words = `${content}`.split(anyNonAlphaNum).filter(Boolean)
- switch (words.length) {
- case 0:
- return ''
- case 1:
- return words[0]
- default:
- const [first, ...rest] = words
- return `${first} ${rest.join('')}`
- }
-}
-
-export const stripSpaces = (content: string | undefined | null) =>
- content?.replaceAll(/\s+/g, ' ').trim()
-
-export const normalizeTagInput = (content: string) =>
- stripAllPunct(content).substring(0, MAX_TAG_CONTENT_LENGTH)
-
-const allLatinLetters = new RegExp(String.raw`^[\s -~\p{Script=Latin}]+$`, 'u')
-
-export const clampTagLength = (tagContent: string) => {
- if (allLatinLetters.test(tagContent)) {
- if (tagContent.length > TAG_CONTENT_CLAMP_LATIN_LETTERS_LENGTH) {
- // allow 20 chars for ASCII/latin letters only tag
- return `${tagContent.slice(0, TAG_CONTENT_CLAMP_LATIN_LETTERS_LENGTH)}…`
- }
- } else {
- if (tagContent.length > TAG_CONTENT_CLAMP_LENGTH) {
- return `${tagContent.slice(0, TAG_CONTENT_CLAMP_LENGTH)}…`
- }
- }
- return tagContent
-}
diff --git a/src/common/utils/text/index.ts b/src/common/utils/text/index.ts
new file mode 100644
index 0000000000..bc14326959
--- /dev/null
+++ b/src/common/utils/text/index.ts
@@ -0,0 +1,22 @@
+export * from './article'
+export * from './tag'
+
+// for Twitter and others which do not support non-English in URL
+export const stripNonEnglishUrl = (url: string) => {
+ // const frag = url.split('#', 2)?.[1] // anything after '#'
+ const hash = url.match(/(#[\x21-\x7e]+)$/)?.[1] ?? ''
+ // get the beginning portion of all printable ascii, and must ends with ASCII '\w'
+ const turl = url.match(/^[\x21-\x7e]+[A-Za-z0-9]/)?.[0]
+ return turl ? `${turl}${hash}` : url // fallback to full url
+}
+
+export const stripSpaces = (content: string | undefined | null) =>
+ content?.replaceAll(/\s+/g, ' ').trim()
+
+export const normalizeName = (name: string) => {
+ // convert uppercase to lowercase
+ const lower = name.toLowerCase()
+
+ // remove non-English and numbers characters except '_'
+ return lower.replace(/[^a-z0-9_]/g, '')
+}
diff --git a/src/common/utils/text/tag.ts b/src/common/utils/text/tag.ts
new file mode 100644
index 0000000000..1242d582dc
--- /dev/null
+++ b/src/common/utils/text/tag.ts
@@ -0,0 +1,47 @@
+import {
+ MAX_TAG_CONTENT_LENGTH,
+ TAG_CONTENT_CLAMP_LATIN_LETTERS_LENGTH,
+ TAG_CONTENT_CLAMP_LENGTH,
+} from '~/common/enums'
+
+const anyNonAlphaNum = new RegExp(String.raw`[^\p{Letter}\p{Number}]+`, 'gu')
+const allLatinLetters = new RegExp(String.raw`^[\s -~\p{Script=Latin}]+$`, 'u')
+
+// to simulate slugify at DB server side
+// https://github.com/thematters/matters-metabase/blob/master/sql/stale-tags-create-table-view.sql#L2-L13
+// might be able to use under more scenarios
+export const slugifyTag = (content: string) =>
+ `${content}`
+ // .toLowerCase()
+ .replace(anyNonAlphaNum, '-') // replace all non alpha-number to `-`, including spaces and punctuations
+ .replace(/(^-+|-+$)/g, '') // strip leading or trailing `-` if there's any
+
+const stripTagAllPunct = (content: string) => {
+ const words = `${content}`.split(anyNonAlphaNum).filter(Boolean)
+ switch (words.length) {
+ case 0:
+ return ''
+ case 1:
+ return words[0]
+ default:
+ const [first, ...rest] = words
+ return `${first} ${rest.join('')}`
+ }
+}
+
+export const normalizeTag = (content: string) =>
+ stripTagAllPunct(content).substring(0, MAX_TAG_CONTENT_LENGTH)
+
+export const clampTag = (tagContent: string) => {
+ if (allLatinLetters.test(tagContent)) {
+ if (tagContent.length > TAG_CONTENT_CLAMP_LATIN_LETTERS_LENGTH) {
+ // allow 20 chars for ASCII/latin letters only tag
+ return `${tagContent.slice(0, TAG_CONTENT_CLAMP_LATIN_LETTERS_LENGTH)}…`
+ }
+ } else {
+ if (tagContent.length > TAG_CONTENT_CLAMP_LENGTH) {
+ return `${tagContent.slice(0, TAG_CONTENT_CLAMP_LENGTH)}…`
+ }
+ }
+ return tagContent
+}
diff --git a/src/components/ArticleDigest/Card/index.tsx b/src/components/ArticleDigest/Card/index.tsx
index 3301f67a47..c34249fbf6 100644
--- a/src/components/ArticleDigest/Card/index.tsx
+++ b/src/components/ArticleDigest/Card/index.tsx
@@ -2,9 +2,9 @@ import classNames from 'classnames'
import { TEST_ID } from '~/common/enums'
import {
- countWordsLength,
+ countChars,
makeSummary,
- subString,
+ normalizeArticleTitle,
toPath,
} from '~/common/utils'
import { Card } from '~/components'
@@ -30,10 +30,10 @@ export const ArticleDigestCard = ({
const { summary, state } = article
const isBanned = state === 'banned'
const cover = !isBanned ? article.cover : null
- const title = subString(article.title, 70)
+ const title = normalizeArticleTitle(article.title, 70)
const cleanedSummary = isBanned
? ''
- : makeSummary(summary, countWordsLength(article.title) > 40 ? 50 : 70)
+ : makeSummary(summary, countChars(article.title) > 40 ? 50 : 70)
const containerClasses = classNames({
container: true,
'has-cover': !!cover,
diff --git a/src/components/Dialogs/HelpDialog/index.tsx b/src/components/Dialogs/HelpDialog/index.tsx
index 8e9ea7a741..31ff86a96c 100644
--- a/src/components/Dialogs/HelpDialog/index.tsx
+++ b/src/components/Dialogs/HelpDialog/index.tsx
@@ -23,11 +23,17 @@ const ReadTime = () => (
<>
} weight="md">
-
+
-
+
>
@@ -41,7 +47,10 @@ const ReadCount = () => (
-
+
>
diff --git a/src/components/Dialogs/TagDialog/Content.tsx b/src/components/Dialogs/TagDialog/Content.tsx
index 9caf481859..b8b7ff1a8b 100644
--- a/src/components/Dialogs/TagDialog/Content.tsx
+++ b/src/components/Dialogs/TagDialog/Content.tsx
@@ -13,7 +13,7 @@ import {
MAX_TAG_DESCRIPTION_LENGTH,
} from '~/common/enums'
import {
- normalizeTagInput, // stripAllPunct, // stripPunctPrefixSuffix,
+ normalizeTag,
parseFormSubmitErrors,
toPath,
translate,
@@ -189,7 +189,7 @@ const TagDialogContent: React.FC = ({
error={touched.newContent && errors.newContent}
onBlur={handleBlur}
onChange={(e) => {
- const newContent = normalizeTagInput(e.target.value)
+ const newContent = normalizeTag(e.target.value)
setFieldValue('newContent', newContent)
return newContent
}}
diff --git a/src/components/Forms/ChangeUserNameForm/Confirm.tsx b/src/components/Forms/ChangeUserNameForm/Confirm.tsx
index fdb8676910..823ef007b2 100644
--- a/src/components/Forms/ChangeUserNameForm/Confirm.tsx
+++ b/src/components/Forms/ChangeUserNameForm/Confirm.tsx
@@ -4,6 +4,7 @@ import _pickBy from 'lodash/pickBy'
import React, { useContext } from 'react'
import {
+ normalizeName,
parseFormSubmitErrors,
translate,
validateComparedUserName,
@@ -58,10 +59,10 @@ const Confirm: React.FC = ({
errors,
touched,
handleBlur,
- handleChange,
handleSubmit,
isSubmitting,
isValid,
+ setFieldValue,
} = useFormik({
initialValues: {
userName: '',
@@ -130,7 +131,11 @@ const Confirm: React.FC = ({
value={values.userName}
error={touched.userName && errors.userName}
onBlur={handleBlur}
- onChange={handleChange}
+ onChange={(e) => {
+ const userName = normalizeName(e.target.value)
+ setFieldValue('userName', userName)
+ return userName
+ }}
/>
= ({
value={values.comparedUserName}
error={touched.comparedUserName && errors.comparedUserName}
onBlur={handleBlur}
- onChange={handleChange}
hint={}
+ onChange={(e) => {
+ const userName = normalizeName(e.target.value)
+ setFieldValue('comparedUserName', userName)
+ return userName
+ }}
/>
)
diff --git a/src/components/Forms/CreateCircleForm/Init.tsx b/src/components/Forms/CreateCircleForm/Init.tsx
index 0014881d6c..a40a148547 100644
--- a/src/components/Forms/CreateCircleForm/Init.tsx
+++ b/src/components/Forms/CreateCircleForm/Init.tsx
@@ -10,6 +10,7 @@ import {
} from '~/common/enums'
import {
analytics,
+ normalizeName,
parseFormSubmitErrors,
validateCircleAmount,
validateCircleDisplayName,
@@ -112,7 +113,7 @@ const Init: React.FC = ({
'name',
intl.formatMessage({
defaultMessage:
- 'Must be between 2-20 characters long. Only letters, numbers and underscores are allowed.',
+ 'Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.',
description: '',
})
)
@@ -167,7 +168,11 @@ const Init: React.FC = ({
value={values.name}
error={touched.name && errors.name}
onBlur={handleBlur}
- onChange={handleChange}
+ onChange={(e) => {
+ const name = normalizeName(e.target.value)
+ setFieldValue('name', name)
+ return name
+ }}
/>
diff --git a/src/components/SearchSelect/SearchingArea/index.tsx b/src/components/SearchSelect/SearchingArea/index.tsx
index b66205843b..96ee99a536 100644
--- a/src/components/SearchSelect/SearchingArea/index.tsx
+++ b/src/components/SearchSelect/SearchingArea/index.tsx
@@ -7,7 +7,7 @@ import {
analytics,
isValidEmail,
mergeConnections,
- normalizeTagInput, // stripAllPunct, // stripPunctPrefixSuffix,
+ normalizeTag, // stripTagAllPunct, // stripPunctPrefixSuffix,
} from '~/common/utils'
import {
EmptySearch,
@@ -101,7 +101,7 @@ const SearchingArea: React.FC = ({
const [searchKey, setSearchKey] = useState('')
const [debouncedSearchKey, setdebouncedSearchKey] = useState('')
const debouncedSetSearchKey = useDebouncedCallback((sk0) => {
- const sk = isTag ? normalizeTagInput(sk0) : sk0
+ const sk = isTag ? normalizeTag(sk0) : sk0
setdebouncedSearchKey(sk)
setSearchKey(sk)
}, INPUT_DEBOUNCE)
@@ -290,9 +290,7 @@ const SearchingArea: React.FC = ({
{canCreateTag && (
diff --git a/src/components/Tag/index.tsx b/src/components/Tag/index.tsx
index 61b88198ee..9c3477fe79 100644
--- a/src/components/Tag/index.tsx
+++ b/src/components/Tag/index.tsx
@@ -2,7 +2,7 @@ import classNames from 'classnames'
import gql from 'graphql-tag'
import Link from 'next/link'
-import { clampTagLength, toPath } from '~/common/utils'
+import { clampTag, toPath } from '~/common/utils'
import { IconClose16, IconProps, TextIcon, TextIconProps } from '~/components'
import { DigestTagFragment } from '~/gql/graphql'
@@ -67,7 +67,7 @@ export const Tag = ({
disabled: !!disabled && !onClick,
})
- const tagName = canClamp ? clampTagLength(tag.content) : tag.content
+ const tagName = canClamp ? clampTag(tag.content) : tag.content
const path = toPath({
page: 'tagDetail',
diff --git a/src/components/UserDigest/Plain/index.tsx b/src/components/UserDigest/Plain/index.tsx
index 2ee29162c2..946193b6ee 100644
--- a/src/components/UserDigest/Plain/index.tsx
+++ b/src/components/UserDigest/Plain/index.tsx
@@ -1,7 +1,7 @@
import classNames from 'classnames'
import { TEST_ID } from '~/common/enums'
-import { subString, toPath } from '~/common/utils'
+import { toPath } from '~/common/utils'
import { LinkWrapper } from '~/components'
import { UserDigestPlainUserFragment } from '~/gql/graphql'
@@ -13,7 +13,6 @@ export type UserDigestPlainProps = {
disabled?: boolean
hasUnderline?: boolean
- displayNameLimit?: number
onClick?: () => void
}
@@ -22,7 +21,6 @@ const Plain = ({
disabled,
onClick,
hasUnderline,
- displayNameLimit,
}: UserDigestPlainProps) => {
const path = toPath({
page: 'userProfile',
@@ -47,10 +45,7 @@ const Plain = ({
testId={TEST_ID.DIGEST_USER_MINI}
>
-
- {displayNameLimit && subString(user.displayName!, displayNameLimit)}
- {!displayNameLimit && user.displayName}
-
+ {user.displayName}
diff --git a/src/views/ArticleDetail/Toolbar/index.tsx b/src/views/ArticleDetail/Toolbar/index.tsx
index 3287c5b172..c69de05295 100644
--- a/src/views/ArticleDetail/Toolbar/index.tsx
+++ b/src/views/ArticleDetail/Toolbar/index.tsx
@@ -1,7 +1,7 @@
import gql from 'graphql-tag'
import { TEST_ID } from '@/src/common/enums'
-import { stripAllPunct, toLocale, toPath } from '~/common/utils'
+import { normalizeTag, toLocale, toPath } from '~/common/utils'
import {
BookmarkButton,
Media,
@@ -123,7 +123,7 @@ const Toolbar = ({
?.map(({ content }) => content)
.join(' ')
.split(/\s+/)
- .map(stripAllPunct)}
+ .map(normalizeTag)}
/>
diff --git a/src/views/ArticleDetail/index.tsx b/src/views/ArticleDetail/index.tsx
index 0f2cec185d..0dd23be780 100644
--- a/src/views/ArticleDetail/index.tsx
+++ b/src/views/ArticleDetail/index.tsx
@@ -6,7 +6,7 @@ import { Waypoint } from 'react-waypoint'
import { ADD_TOAST, DEFAULT_LOCALE, URL_QS } from '~/common/enums'
import {
- stripAllPunct,
+ normalizeTag,
toGlobalId,
toPath,
toUserLanguage,
@@ -224,9 +224,7 @@ const BaseArticleDetail = ({
translated && translatedSummary ? translatedSummary : article.summary
const content =
translated && translatedContent ? translatedContent : article.content
- const keywords = (article.tags || []).map(({ content: c }) =>
- stripAllPunct(c)
- )
+ const keywords = (article.tags || []).map(({ content: c }) => normalizeTag(c))
return (
}>
diff --git a/src/views/TagDetail/index.tsx b/src/views/TagDetail/index.tsx
index a79e50304f..66a3ebae18 100644
--- a/src/views/TagDetail/index.tsx
+++ b/src/views/TagDetail/index.tsx
@@ -6,9 +6,7 @@ import IMAGE_TAG_COVER from '@/public/static/images/tag-cover.png'
import { ERROR_CODES } from '~/common/enums'
import {
fromGlobalId,
- // makeTitle,
- // stripPunctPrefixSuffix,
- stripAllPunct,
+ normalizeTag,
stripSpaces,
toGlobalId,
toPath,
@@ -115,11 +113,9 @@ const TagDetail = ({ tag }: { tag: TagFragmentFragment }) => {
const isOfficial = !!tag?.isOfficial
const canAdd = !isOfficial || (isOfficial && isMatty)
- const title =
- // (tag.description ? `${makeTitle(tag.description, 80)} ` : '') +
- '#' + stripAllPunct(tag.content)
- const keywords = tag.content.split(/\s+/).filter(Boolean).map(stripAllPunct) // title.includes(tag.content) ??
- const description = stripSpaces(tag.description) // || stripAllPunct(tag.content)
+ const title = '#' + normalizeTag(tag.content)
+ const keywords = tag.content.split(/\s+/).filter(Boolean).map(normalizeTag)
+ const description = stripSpaces(tag.description)
const path = toPath({ page: 'tagDetail', tag })
/**
@@ -150,7 +146,7 @@ const TagDetail = ({ tag }: { tag: TagFragmentFragment }) => {
/>
{
jsonLdData={{
'@context': 'https://schema.org',
'@type': 'ItemList', // should follow with some recent articles under 'itemListElement'
- name: title, // stripAllPunct(tag.content),
+ name: title,
description,
keywords,
image:
From 0080855e4f13922ece156a8ba55a96931f01eaca Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Thu, 30 Mar 2023 13:45:06 +0700
Subject: [PATCH 34/92] feat(test): add test for username input normalization
---
src/components/Layout/Header/Title/index.tsx | 2 +-
tests/forms.spec.ts | 22 ++++++++++++++++++++
tests/helpers/poms/userProfile.ts | 15 +++++++++++++
3 files changed, 38 insertions(+), 1 deletion(-)
create mode 100644 tests/forms.spec.ts
diff --git a/src/components/Layout/Header/Title/index.tsx b/src/components/Layout/Header/Title/index.tsx
index f1a5bee750..f51f3c1b91 100644
--- a/src/components/Layout/Header/Title/index.tsx
+++ b/src/components/Layout/Header/Title/index.tsx
@@ -6,7 +6,7 @@ const LayoutHeaderTitle: React.FC> = ({
children,
...props
}) => (
- jump(document.body)} role="button">
+ jump(document.body)}>
{children ? children : }
)
diff --git a/tests/forms.spec.ts b/tests/forms.spec.ts
new file mode 100644
index 0000000000..2048464d61
--- /dev/null
+++ b/tests/forms.spec.ts
@@ -0,0 +1,22 @@
+import { expect, test } from '@playwright/test'
+import _random from 'lodash/random'
+
+import { PATHS } from '~/common/enums'
+
+import { authedTest, pageGoto } from './helpers'
+
+test.describe('Change username', () => {
+ authedTest('input normalization', async ({ alicePage }) => {
+ // Go to change username page
+ await pageGoto(alicePage, PATHS.ME_SETTINGS_CHANGE_USERNAME)
+
+ // Input uppcase and non-underlined characters
+ const $userNameInput = alicePage.getByPlaceholder('Enter Matters ID', {
+ exact: true,
+ })
+ await $userNameInput.fill('UPPERcase*-_.":]}[~!?')
+
+ // Expect the input to be normalized
+ expect(await $userNameInput.inputValue()).toBe('uppercase_')
+ })
+})
diff --git a/tests/helpers/poms/userProfile.ts b/tests/helpers/poms/userProfile.ts
index dec661005c..5d7886e3e1 100644
--- a/tests/helpers/poms/userProfile.ts
+++ b/tests/helpers/poms/userProfile.ts
@@ -82,6 +82,21 @@ export class UserProfilePage {
await expect(this.feedArticles.first()).toBeVisible()
}
+ async gotoSettings() {
+ // go to homepage
+ await pageGoto(this.page, '/')
+
+ // click "My Page" button
+ await this.page.getByRole('button', { name: 'My Page' }).click()
+
+ // click "Settings" link
+ await this.page.getByRole('link', { name: 'Settings' }).click()
+ await this.page
+ .getByTestId(TEST_ID.LAYOUT_HEADER)
+ .getByRole('heading', { level: 1, name: 'Settings', exact: true })
+ .isVisible()
+ }
+
async goto(userName: string) {
await pageGoto(this.page, `/@${userName}`)
}
From cd7ea47a71d8424fe87376447b36d2a18eea1847 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 30 Mar 2023 17:54:43 +0800
Subject: [PATCH 35/92] feat(Editor): revise editor search select dialog
---
.../Editor/TagCustomStagingArea/index.tsx | 2 +
.../Forms/EditorSearchSelectForm/index.tsx | 12 +-
.../SearchingArea/EditorSearchingArea.tsx | 354 ++++++++++++++++++
.../SearchSelect/StagingArea/index.tsx | 1 +
4 files changed, 368 insertions(+), 1 deletion(-)
create mode 100644 src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
diff --git a/src/components/Editor/TagCustomStagingArea/index.tsx b/src/components/Editor/TagCustomStagingArea/index.tsx
index b9a46f1b85..187bca10ba 100644
--- a/src/components/Editor/TagCustomStagingArea/index.tsx
+++ b/src/components/Editor/TagCustomStagingArea/index.tsx
@@ -22,6 +22,7 @@ const TagCustomStagingArea = ({
nodes: tags,
setNodes: setTags,
hint,
+ toStagingArea,
}: CustomStagingAreaProps) => {
const viewer = useContext(ViewerContext)
@@ -54,6 +55,7 @@ const TagCustomStagingArea = ({
const addTag = (tag: SelectTag) => {
const oldTags = tags.filter((t) => t.node.id !== tag.id)
setTags([...oldTags, { node: tag, selected: true }])
+ toStagingArea && toStagingArea()
}
if (loading) {
diff --git a/src/components/Forms/EditorSearchSelectForm/index.tsx b/src/components/Forms/EditorSearchSelectForm/index.tsx
index b3c28c5dc4..b027e38467 100644
--- a/src/components/Forms/EditorSearchSelectForm/index.tsx
+++ b/src/components/Forms/EditorSearchSelectForm/index.tsx
@@ -10,7 +10,7 @@ import { Dialog, IconAdd16, TextIcon, Translate } from '~/components'
import SearchingArea, {
SearchType,
SelectNode,
-} from '~/components/SearchSelect/SearchingArea'
+} from '~/components/SearchSelect/SearchingArea/EditorSearchingArea'
import StagingArea, {
CustomStagingAreaProps,
StagingNode,
@@ -180,6 +180,16 @@ const EditorSearchSelectForm = ({
addNodeToStaging={addNodeToStaging}
createTag={createTag}
inviteEmail={inviteEmail}
+ CustomStagingArea={
+ CustomStagingArea && (
+
+ )
+ }
autoFocus
/>
)}
diff --git a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
new file mode 100644
index 0000000000..e58f9bb93f
--- /dev/null
+++ b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
@@ -0,0 +1,354 @@
+import { useLazyQuery } from '@apollo/react-hooks'
+import { useContext, useEffect, useState } from 'react'
+import { useDebouncedCallback } from 'use-debounce'
+
+import { INPUT_DEBOUNCE } from '~/common/enums'
+import {
+ analytics,
+ isValidEmail,
+ mergeConnections,
+ normalizeTagInput, // stripAllPunct, // stripPunctPrefixSuffix,
+} from '~/common/utils'
+import {
+ EmptySearch,
+ InfiniteScroll,
+ Spinner,
+ toDigestTagPlaceholder,
+ usePublicLazyQuery,
+ ViewerContext,
+} from '~/components'
+import { toUserDigestMiniPlaceholder } from '~/components/UserDigest/Mini'
+import {
+ ListViewerArticlesQuery,
+ SearchExclude,
+ SearchFilter,
+ SelectSearchQuery,
+} from '~/gql/graphql'
+
+import SearchSelectNode from '../SearchSelectNode'
+import styles from '../styles.css'
+import CreateTag from './CreateTag'
+import { LIST_VIEWER_ARTICLES, SELECT_SEARCH } from './gql'
+import InviteEmail from './InviteEmail'
+import SearchInput, {
+ SearchInputProps,
+ SearchType as SearchInputType,
+} from './SearchInput'
+
+/**
+ * This is a sub-component of search-and-select, and it will show
+ * search results after typing in . Node will be
+ * added into the staging area when click.
+ *
+ */
+export type SearchType = SearchInputType
+export type SelectNode = NonNullable<
+ SelectSearchQuery['search']['edges']
+>[0]['node']
+export type SelectArticle = NonNullable<
+ SelectSearchQuery['search']['edges']
+>[0]['node'] & { __typename: 'Article' }
+export type SelectTag = NonNullable<
+ SelectSearchQuery['search']['edges']
+>[0]['node'] & { __typename: 'Tag' }
+export type SelectUser = NonNullable<
+ SelectSearchQuery['search']['edges']
+>[0]['node'] & { __typename: 'User' }
+
+type SearchingAreaProps = {
+ searchType: SearchType
+ searchFilter?: SearchFilter
+ searchExclude?: SearchExclude
+
+ inSearchingArea: boolean
+ toStagingArea: () => void
+ toSearchingArea: () => void
+ addNodeToStaging: (node: SelectNode) => void
+
+ createTag?: boolean
+ inviteEmail?: boolean
+
+ CustomStagingArea?: React.ReactNode
+} & Pick
+
+type Mode = 'search' | 'list'
+
+const EditorSearchingArea: React.FC = ({
+ searchType,
+ searchFilter,
+ searchExclude,
+
+ inSearchingArea,
+ toStagingArea,
+ toSearchingArea,
+ addNodeToStaging,
+
+ createTag,
+ inviteEmail,
+ CustomStagingArea,
+}) => {
+ const viewer = useContext(ViewerContext)
+
+ const isArticle = searchType === 'Article'
+ const isUser = searchType === 'User' || searchType === 'Invitee'
+ const isTag = searchType === 'Tag'
+ const hasListMode = viewer.id === searchFilter?.authorId && isArticle
+ const [mode, setMode] = useState(hasListMode ? 'list' : 'search')
+ const isSearchMode = mode === 'search'
+ const isListMode = mode === 'list'
+
+ const [searching, setSearching] = useState(false)
+ const [searchingNodes, setSearchingNodes] = useState([])
+
+ const [searchKey, setSearchKey] = useState('')
+ const [debouncedSearchKey, setdebouncedSearchKey] = useState('')
+ const debouncedSetSearchKey = useDebouncedCallback((sk0) => {
+ const sk = isTag ? normalizeTagInput(sk0) : sk0
+ setdebouncedSearchKey(sk)
+ setSearchKey(sk)
+ }, INPUT_DEBOUNCE)
+
+ // Data Fetching
+ const [lazySearch, { data, loading, fetchMore }] =
+ usePublicLazyQuery(
+ SELECT_SEARCH,
+ {},
+ { publicQuery: !viewer.isAuthed }
+ )
+ const [
+ loadList,
+ { data: listData, loading: listLoading, fetchMore: fetchMoreList },
+ ] = useLazyQuery(LIST_VIEWER_ARTICLES)
+
+ // pagination
+ const { edges: searchEdges, pageInfo: searchPageInfo } = data?.search || {}
+ const { edges: listEdges, pageInfo: listPageInfo } =
+ listData?.viewer?.articles || {}
+
+ // load next page
+ const loadMore = async () => {
+ analytics.trackEvent('load_more', {
+ type: isArticle ? 'search_article' : isTag ? 'search_tag' : 'search_user',
+ location: searchEdges?.length || 0,
+ })
+
+ fetchMore({
+ variables: { after: searchPageInfo?.endCursor },
+ updateQuery: (previousResult, { fetchMoreResult }) =>
+ mergeConnections({
+ oldData: previousResult,
+ newData: fetchMoreResult,
+ path: 'search',
+ }),
+ })
+ }
+ const loadMoreList = async () => {
+ fetchMoreList({
+ variables: { after: listPageInfo?.endCursor },
+ updateQuery: (previousResult, { fetchMoreResult }) =>
+ mergeConnections({
+ oldData: previousResult,
+ newData: fetchMoreResult,
+ path: 'viewer.articles',
+ }),
+ })
+ }
+
+ const searchNodes = searchEdges?.map(({ node }) => node) || []
+ const searchNodeIds = searchNodes.map((n) => n.id).join(',')
+ const listNode =
+ listEdges
+ ?.map(({ node }) => node)
+ .filter((node) => node.articleState === 'active') || []
+ const listNodeIds = listNode.map((n) => n.id).join(',')
+ const search = (key: string) => {
+ const type = searchType === 'Invitee' ? 'User' : searchType
+ lazySearch({
+ variables: {
+ key,
+ type,
+ filter: searchFilter,
+ exclude: searchExclude,
+ first: 10,
+ },
+ })
+ }
+
+ // handling changes from search input
+ const onSearchInputChange = (value: string) => {
+ setSearchKey(value)
+ debouncedSetSearchKey(value)
+
+ if (hasListMode) {
+ setMode(value ? 'search' : 'list')
+ toSearchingArea()
+ return
+ }
+ }
+ const onSearchInputFocus = () => {
+ if (hasListMode) {
+ if (!searchKey) {
+ setMode('list')
+ }
+ } else if (searchingNodes.length <= 0) {
+ return
+ }
+
+ toSearchingArea()
+ }
+ const onSearchInputBlur = () => {
+ if (isSearchMode) {
+ return
+ }
+
+ // to prevent clicking node doesn't work
+ setTimeout(() => {
+ toStagingArea()
+ }, 100)
+ }
+
+ // searching
+ useEffect(() => {
+ if (debouncedSearchKey) {
+ search(debouncedSearchKey)
+ }
+ }, [debouncedSearchKey])
+
+ useEffect(() => {
+ setSearching(loading)
+ setSearchingNodes(searchNodes)
+ }, [loading, searchNodeIds])
+
+ // list
+ useEffect(() => {
+ if (!isListMode) {
+ return
+ }
+
+ // use cache or fetch
+ if (listNode.length > 0) {
+ setSearchingNodes(listNode)
+ } else {
+ loadList()
+ }
+ toSearchingArea()
+ }, [isListMode])
+
+ useEffect(() => {
+ setSearching(listLoading)
+ setSearchingNodes(listNode)
+ }, [listLoading, listNodeIds])
+
+ const hasNodes = searchNodes.length > 0
+ const haslistNode = listNode.length > 0
+ const canCreateTag =
+ isTag &&
+ searchKey &&
+ createTag &&
+ !searchNodes.some(
+ (node) => node.__typename === 'Tag' && node.content === searchKey
+ )
+ const canInviteEmail =
+ isUser &&
+ inviteEmail &&
+ searchKey &&
+ isValidEmail(searchKey.trim(), { allowPlusSign: false })
+
+ /**
+ * Render
+ */
+ return (
+ <>
+
+
+ {inSearchingArea && (
+
+ {searching && }
+ {searchKey.length === 0 && !!CustomStagingArea && CustomStagingArea}
+ {/* Search */}
+ {searchKey.length > 0 && (
+ <>
+ {isSearchMode &&
+ !searching &&
+ !hasNodes &&
+ !canCreateTag &&
+ !canInviteEmail && }
+
+ {isSearchMode &&
+ !searching &&
+ (hasNodes || canCreateTag || canInviteEmail) && (
+
+
+ {canCreateTag && (
+ -
+
+
+ )}
+ {canInviteEmail && (
+ -
+
+
+ )}
+
+ {searchingNodes.map((node) => (
+ -
+
+
+ ))}
+
+
+ )}
+
+ {/* List */}
+ {isListMode && !searching && !haslistNode && }
+
+ {isListMode && !searching && haslistNode && (
+
+
+ {searchingNodes.map((node) => (
+ -
+
+
+ ))}
+
+
+ )}
+ >
+ )}
+
+
+
+ )}
+ >
+ )
+}
+
+export default EditorSearchingArea
diff --git a/src/components/SearchSelect/StagingArea/index.tsx b/src/components/SearchSelect/StagingArea/index.tsx
index 8dc744f570..66aa54d0a4 100644
--- a/src/components/SearchSelect/StagingArea/index.tsx
+++ b/src/components/SearchSelect/StagingArea/index.tsx
@@ -31,6 +31,7 @@ export interface CustomStagingAreaProps {
nodes: StagingNode[]
setNodes: (nodes: StagingNode[]) => void
hint: TextId
+ toStagingArea?: () => void
}
type StagingAreaProps = BaseStagingAreaProps & {
From 519d166fd778a836c7af5baa99e61fa4fe618fbe Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 30 Mar 2023 18:29:12 +0800
Subject: [PATCH 36/92] feat(Editor): adjust height of SearchInput
---
.../SearchSelect/SearchingArea/SearchInput/styles.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/SearchSelect/SearchingArea/SearchInput/styles.css b/src/components/SearchSelect/SearchingArea/SearchInput/styles.css
index 855c5c0435..c7a2eaa198 100644
--- a/src/components/SearchSelect/SearchingArea/SearchInput/styles.css
+++ b/src/components/SearchSelect/SearchingArea/SearchInput/styles.css
@@ -1,5 +1,5 @@
:root {
- --search-input-height: 3rem;
+ --search-input-height: 3.375rem;
--search-input-button-width: 2rem;
}
From 47fe9ec49ceeb55bde0e92069b7d09ae2a515469 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Fri, 31 Mar 2023 10:16:57 +0700
Subject: [PATCH 37/92] feat(announcement): revise
---
src/components/Dialogs/HelpDialog/index.tsx | 15 +-
.../Home/Announcements/Carousel/index.tsx | 18 +-
.../Home/Announcements/Carousel/styles.css | 8 +-
.../Announcements/DropdownActions/index.tsx | 156 ------------------
.../Announcements/DropdownActions/styles.css | 6 -
src/views/Home/Announcements/index.tsx | 30 +---
6 files changed, 23 insertions(+), 210 deletions(-)
delete mode 100644 src/views/Home/Announcements/DropdownActions/index.tsx
delete mode 100644 src/views/Home/Announcements/DropdownActions/styles.css
diff --git a/src/components/Dialogs/HelpDialog/index.tsx b/src/components/Dialogs/HelpDialog/index.tsx
index 8e9ea7a741..31ff86a96c 100644
--- a/src/components/Dialogs/HelpDialog/index.tsx
+++ b/src/components/Dialogs/HelpDialog/index.tsx
@@ -23,11 +23,17 @@ const ReadTime = () => (
<>
} weight="md">
-
+
-
+
>
@@ -41,7 +47,10 @@ const ReadCount = () => (
-
+
>
diff --git a/src/views/Home/Announcements/Carousel/index.tsx b/src/views/Home/Announcements/Carousel/index.tsx
index 05fe723694..4626a59fcd 100644
--- a/src/views/Home/Announcements/Carousel/index.tsx
+++ b/src/views/Home/Announcements/Carousel/index.tsx
@@ -12,26 +12,18 @@ import {
} from '~/components'
import { VisibleAnnouncementsQuery } from '~/gql/graphql'
-import DropdownActions, { DropdownActionsProps } from '../DropdownActions'
import Dot from './Dot'
import styles from './styles.css'
type CarouselProps = {
items: VisibleAnnouncementsQuery['official']['announcements']
hide: () => void
-} & DropdownActionsProps
-
-const Carousel = ({
- type,
- setType,
- items,
- hide,
- ...controlsProps
-}: CarouselProps) => {
+}
+
+const Carousel = ({ items, hide }: CarouselProps) => {
const { lang } = useContext(LanguageContext)
const [dot, setDot] = useState(0)
- // @ts-ignore
- const [snaps, setSnaps] = useState([])
+ const [, setSnaps] = useState([])
const [carousel, carouselApi] = useEmblaCarousel({
loop: true,
skipSnaps: false,
@@ -109,8 +101,6 @@ const Carousel = ({
-
-
{items?.map((_, index) => (
void
- isInDropdown?: boolean
-} & ControlsProps
-
-export type DropdownActionsProps = {
- type: string
- setType: (type: string) => void
-} & ControlsProps
-
-const TypeLabel = ({ type }: { type: string }) => {
- switch (type) {
- case 'community': {
- return
- }
- case 'product': {
- return
- }
- case 'seminar': {
- return
- }
- default: {
- return
- }
- }
-}
-
-const Content = ({
- isInDropdown,
- setType,
- hasCommunity,
- hasProduct,
- hasSeminar,
-}: ContentProps) => {
- return (
-
- )
-}
-
-const DropdownActions = ({
- type,
- setType,
- ...controlsProps
-}: DropdownActionsProps) => {
- return (
- ,
- placement: 'bottom-start',
- }}
- dialog={{
- content: ,
- title: (
-
- ),
- }}
- >
- {({ openDialog, type: popupType, ref }) => (
-
-
- }
- color="white"
- size="sm"
- spacing="xxtight"
- textPlacement="right"
- >
-
-
-
-
-
-
- )}
-
- )
-}
-
-export default DropdownActions
diff --git a/src/views/Home/Announcements/DropdownActions/styles.css b/src/views/Home/Announcements/DropdownActions/styles.css
deleted file mode 100644
index 5ae946b942..0000000000
--- a/src/views/Home/Announcements/DropdownActions/styles.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.btn {
- position: relative;
- background-color: rgb(0 0 0 / 30%);
- border: 1px solid rgb(255 255 255 / 40%);
- border-radius: 1rem;
-}
diff --git a/src/views/Home/Announcements/index.tsx b/src/views/Home/Announcements/index.tsx
index 5c58da7e82..9d07f154c9 100644
--- a/src/views/Home/Announcements/index.tsx
+++ b/src/views/Home/Announcements/index.tsx
@@ -1,7 +1,5 @@
import { useApolloClient, useQuery } from '@apollo/react-hooks'
import _get from 'lodash/get'
-import _some from 'lodash/some'
-import { useState } from 'react'
import { FormattedMessage } from 'react-intl'
import { ADD_TOAST, STORAGE_KEY_ANNOUNCEMENT } from '~/common/enums'
@@ -20,44 +18,22 @@ const BaseAnnouncements = ({ hide }: BaseAnnouncementsProps) => {
VISIBLE_ANNOUNCEMENTS,
{ variables: { input: { visible: true } } }
)
- const [type, setType] = useState('all')
if (loading || error) {
return null
}
- const allItems = _get(
+ const items = _get(
data,
'official.announcements',
[]
) as VisibleAnnouncementsQuery['official']['announcements']
- if (!allItems || allItems.length === 0) {
+ if (!items || items.length === 0) {
return null
}
- // check controls
- const hasCommunity = _some(allItems, { type: 'community' })
- const hasProduct = _some(allItems, { type: 'product' })
- const hasSeminar = _some(allItems, { type: 'seminar' })
-
- let items = allItems
-
- if (type !== 'all') {
- items = items.filter((item) => item.type === type)
- }
-
- return (
-
- )
+ return
}
const Announcements = () => {
From 2351bdb5340f3eba9830dec0599232ab75781aa2 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Fri, 31 Mar 2023 10:23:30 +0700
Subject: [PATCH 38/92] feat(cover): border radius
---
src/components/Cover/styles.css | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/components/Cover/styles.css b/src/components/Cover/styles.css
index bb7c9e3c25..0280c79fb4 100644
--- a/src/components/Cover/styles.css
+++ b/src/components/Cover/styles.css
@@ -1,5 +1,7 @@
.cover {
position: relative;
+ overflow: hidden;
+ border-radius: 0 0 1.25rem 1.25rem;
& :global(img) {
@mixin object-fit-cover;
From 2c06d0cff4fbd6f229bd7519492d0ffb9647fe2d Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Fri, 31 Mar 2023 11:47:07 +0700
Subject: [PATCH 39/92] feat(text): adjust typography of subtext (digests)
---
src/common/styles/mixins.css | 10 ++++----
src/common/styles/variables/typography.css | 8 +++----
.../Concise/FooterActions/styles.css | 2 +-
.../FooterActions/DonationCount/index.tsx | 9 +++-----
.../Feed/FooterActions/ReadTime/index.tsx | 18 ++++++---------
.../Feed/FooterActions/index.tsx | 23 ++++---------------
src/components/CircleDigest/Plain/index.tsx | 4 ++--
src/components/CircleDigest/Plain/styles.css | 4 ++++
src/components/DateTime/styles.css | 6 ++---
.../Interaction/LinkWrapper/styles.css | 5 ++++
src/components/TagDigest/Feed/index.tsx | 4 ++--
src/components/TagDigest/Sidebar/index.tsx | 4 ++--
src/views/ArticleDetail/MetaInfo/styles.css | 6 ++---
13 files changed, 46 insertions(+), 57 deletions(-)
diff --git a/src/common/styles/mixins.css b/src/common/styles/mixins.css
index c9fa3c2a0d..9ff04eb1f7 100644
--- a/src/common/styles/mixins.css
+++ b/src/common/styles/mixins.css
@@ -212,9 +212,9 @@
@mixin flex-center-space-between;
margin-top: var(--spacing-base);
- font-size: var(--font-size-timestamp);
- font-weight: var(--font-weight-timestamp);
- line-height: var(--line-height-timestamp);
+ font-size: var(--font-size-subtext);
+ font-weight: var(--font-weight-subtext);
+ line-height: var(--line-height-subtext);
& .left,
& .right {
@@ -225,7 +225,7 @@
color: var(--color-grey-dark);
& :global(> * + *) {
- padding-left: var(--spacing-xx-tight);
+ padding-left: var(--spacing-base);
}
}
@@ -233,7 +233,7 @@
color: var(--color-black);
& :global(> * + *) {
- padding-left: var(--spacing-loose);
+ padding-left: var(--spacing-base);
}
}
}
diff --git a/src/common/styles/variables/typography.css b/src/common/styles/variables/typography.css
index b75fbf102d..8da19b2347 100644
--- a/src/common/styles/variables/typography.css
+++ b/src/common/styles/variables/typography.css
@@ -47,10 +47,10 @@
--line-height-feed-title: 1.3333; /* 24/18 */
--font-weight-feed-title: var(--font-weight-medium);
- /* Timestamp */
- --font-size-timestamp: var(--font-size-xs);
- --line-height-timestamp: 1.3333; /* 16/12 */
- --font-weight-timestamp: var(--font-weight-normal);
+ /* Subtext: digest footer, datetime, etc. */
+ --font-size-subtext: var(--font-size-xs);
+ --line-height-subtext: 1.3333; /* 16/12 */
+ --font-weight-subtext: var(--font-weight-normal);
/* Article Title */
--font-size-article-title: var(--font-size-xl);
diff --git a/src/components/ArticleDigest/Concise/FooterActions/styles.css b/src/components/ArticleDigest/Concise/FooterActions/styles.css
index e8757d6abc..c5944b5c84 100644
--- a/src/components/ArticleDigest/Concise/FooterActions/styles.css
+++ b/src/components/ArticleDigest/Concise/FooterActions/styles.css
@@ -2,7 +2,7 @@ footer {
@mixin feed-footer-actions;
& .left {
- padding-right: var(--spacing-base);
+ display: inline-flex;
& :global(> * + *) {
padding-left: var(--spacing-x-tight);
diff --git a/src/components/ArticleDigest/Feed/FooterActions/DonationCount/index.tsx b/src/components/ArticleDigest/Feed/FooterActions/DonationCount/index.tsx
index e447531ed7..b79b6b2121 100644
--- a/src/components/ArticleDigest/Feed/FooterActions/DonationCount/index.tsx
+++ b/src/components/ArticleDigest/Feed/FooterActions/DonationCount/index.tsx
@@ -1,28 +1,25 @@
import { numAbbr } from '~/common/utils'
-import { IconDonate24, IconDotDivider, TextIcon } from '~/components'
+import { IconDonate24, TextIcon } from '~/components'
import { ActionsDonationCountArticleFragment } from '~/gql/graphql'
import { fragments } from './gql'
interface DonationCountProps {
article: ActionsDonationCountArticleFragment
- hasDivider: boolean
}
-const DonationCount = ({ article, hasDivider }: DonationCountProps) => {
+const DonationCount = ({ article }: DonationCountProps) => {
if (!article.transactionsReceivedBy.totalCount) {
return null
}
return (
<>
- } size="xs" color="grey-dark">
+ } size="xs" color="grey-dark">
{article.transactionsReceivedBy.totalCount > 0
? numAbbr(article.transactionsReceivedBy.totalCount)
: undefined}
-
- {hasDivider && }
>
)
}
diff --git a/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx b/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx
index 9bc80eb6ec..28afbf4dd7 100644
--- a/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx
+++ b/src/components/ArticleDigest/Feed/FooterActions/ReadTime/index.tsx
@@ -1,20 +1,14 @@
import { numAbbr, numRound } from '~/common/utils'
-import {
- IconDotDivider,
- IconReadTimeTotal16,
- TextIcon,
- Translate,
-} from '~/components'
+import { IconReadTimeTotal16, TextIcon, Translate } from '~/components'
import { ActionsReadTimeArticleFragment } from '~/gql/graphql'
import { fragments } from './gql'
interface ResponseCountProps {
article: ActionsReadTimeArticleFragment
- hasDivider: boolean
}
-const ReadTime = ({ article, hasDivider }: ResponseCountProps) => {
+const ReadTime = ({ article }: ResponseCountProps) => {
if (!article.readTime) {
return null
}
@@ -28,13 +22,15 @@ const ReadTime = ({ article, hasDivider }: ResponseCountProps) => {
return (
<>
- } size="xs" color="grey-dark">
+ }
+ size="xs"
+ color="grey-dark"
+ >
{numAbbr(readHour, 1)}{' '}
-
- {hasDivider && }
>
)
}
diff --git a/src/components/ArticleDigest/Feed/FooterActions/index.tsx b/src/components/ArticleDigest/Feed/FooterActions/index.tsx
index fdd2ea41df..5329b33697 100644
--- a/src/components/ArticleDigest/Feed/FooterActions/index.tsx
+++ b/src/components/ArticleDigest/Feed/FooterActions/index.tsx
@@ -3,7 +3,6 @@ import {
BookmarkButton,
DateTime,
IconArchive24,
- IconDotDivider,
IconPaywall16,
IconPin24,
} from '~/components'
@@ -24,36 +23,24 @@ export type FooterActionsProps = {
const FooterActions = ({ article, date, ...controls }: FooterActionsProps) => {
const hasDate = date !== false
- const hasDonation = article.transactionsReceivedBy.totalCount > 0
return (
-
-
-
-
void
-}
-
-const BaseAnnouncements = ({ hide }: BaseAnnouncementsProps) => {
+const Announcements = () => {
const { data, error, loading } = useQuery(
VISIBLE_ANNOUNCEMENTS,
{ variables: { input: { visible: true } } }
@@ -33,39 +26,7 @@ const BaseAnnouncements = ({ hide }: BaseAnnouncementsProps) => {
return null
}
- return
-}
-
-const Announcements = () => {
- const client = useApolloClient()
-
- const hide = () => {
- const now = Date.now()
- storage.set(STORAGE_KEY_ANNOUNCEMENT, now)
- client.writeData({
- id: 'ClientPreference:local',
- data: {
- announcement: now,
- },
- })
-
- window.dispatchEvent(
- new CustomEvent(ADD_TOAST, {
- detail: {
- color: 'green',
- content: (
-
- ),
- buttonPlacement: 'center',
- },
- })
- )
- }
-
- return
+ return
}
export default Announcements
diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx
index 46ce06c470..355443a365 100644
--- a/src/views/Home/index.tsx
+++ b/src/views/Home/index.tsx
@@ -1,35 +1,10 @@
-import { useQuery } from '@apollo/react-hooks'
-import differenceInDays from 'date-fns/differenceInDays'
-import _get from 'lodash/get'
-import _some from 'lodash/some'
-import dynamic from 'next/dynamic'
-
-import { STORAGE_KEY_ANNOUNCEMENT } from '~/common/enums'
-import { storage } from '~/common/utils'
import { Layout, Spacer } from '~/components'
-import CLIENT_PREFERENCE from '~/components/GQL/queries/clientPreference'
-import { ClientPreferenceQuery } from '~/gql/graphql'
+import Announcements from './Announcements'
import Feed from './Feed'
import Sidebar from './Sidebar'
-const DynamicAnnouncements = dynamic(() => import('./Announcements'), {
- ssr: true, // enable for first screen
-})
-
const Home = () => {
- // determine whether announcement should be shown or not
- const { data } = useQuery(CLIENT_PREFERENCE, {
- variables: { id: 'local' },
- })
- const storedValue =
- typeof window !== 'undefined' ? storage.get(STORAGE_KEY_ANNOUNCEMENT) : {}
- const storedTime =
- typeof storedValue === 'number'
- ? storedValue
- : data?.clientPreference?.announcement || 0
- const showAnnouncement = differenceInDays(Date.now(), storedTime) > 7
-
return (
{
>
- {showAnnouncement && }
+
From 9851158649e99a28bb8201517e4781cb74a3596e Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Fri, 31 Mar 2023 12:24:51 +0700
Subject: [PATCH 43/92] feat(sidebar): revise search bar & switch language
button
---
public/static/icons/16px/world.svg | 7 ++----
.../Buttons/LanguageSwitch/index.tsx | 24 +++++++------------
src/components/Buttons/ViewAll/index.tsx | 1 +
src/components/Dialogs/HelpDialog/index.tsx | 15 +++++++++---
src/components/Search/SearchBar/styles.css | 2 --
5 files changed, 23 insertions(+), 26 deletions(-)
diff --git a/public/static/icons/16px/world.svg b/public/static/icons/16px/world.svg
index 5f41e19dcd..1a36e6b8a4 100644
--- a/public/static/icons/16px/world.svg
+++ b/public/static/icons/16px/world.svg
@@ -1,7 +1,4 @@
diff --git a/src/components/Buttons/LanguageSwitch/index.tsx b/src/components/Buttons/LanguageSwitch/index.tsx
index f05122e771..e088c1de99 100644
--- a/src/components/Buttons/LanguageSwitch/index.tsx
+++ b/src/components/Buttons/LanguageSwitch/index.tsx
@@ -1,6 +1,5 @@
import { useContext } from 'react'
-import { ReactComponent as IconArrowDown } from '@/public/static/icons/8px/arrow-down.svg'
import { LANG_TEXT_MAP, Z_INDEX } from '~/common/enums'
import {
Button,
@@ -11,7 +10,6 @@ import {
Menu,
TextIcon,
Translate,
- withIcon,
} from '~/components'
import { UserLanguage } from '~/gql/graphql'
@@ -65,17 +63,17 @@ export const LanguageSwitchContent = ({
type LanguageSwitchProps = {
size?: 'sm' | 'lg'
- bgColor?: 'grey-lighter' | 'grey-darkest'
+ bgColor?: 'grey-darkest'
}
export const LanguageSwitch: React.FC = ({
size = 'sm',
- bgColor = 'grey-lighter',
+ bgColor,
}) => {
const { lang } = useContext(LanguageContext)
- const iconColor = bgColor === 'grey-lighter' ? 'grey' : 'white'
- const textSize = size === 'sm' ? 'xs' : 'md'
+ const iconColor = bgColor === 'grey-darkest' ? 'white' : 'grey'
+ const textSize = size === 'sm' ? 'sm-s' : 'md'
return (
= ({
size={[null, size === 'sm' ? '1.25rem' : '1.75rem']}
spacing={[0, 'xtight']}
bgColor={bgColor}
+ bgActiveColor={
+ bgColor === 'grey-darkest' ? undefined : 'grey-lighter'
+ }
onClick={openDialog}
aria-haspopup={type}
ref={ref}
>
} size={textSize} color={iconColor}>
-
- {LANG_TEXT_MAP[lang]}
-
+ {LANG_TEXT_MAP[lang]}
)}
diff --git a/src/components/Buttons/ViewAll/index.tsx b/src/components/Buttons/ViewAll/index.tsx
index 662f8af967..25424bd2e9 100644
--- a/src/components/Buttons/ViewAll/index.tsx
+++ b/src/components/Buttons/ViewAll/index.tsx
@@ -10,6 +10,7 @@ export const ViewAllButton: React.FC = ({ ...props }) => {
size={[null, '1.75rem']}
spacing={[0, 'tight']}
borderColor="green"
+ borderWidth="sm"
{...props}
>
diff --git a/src/components/Dialogs/HelpDialog/index.tsx b/src/components/Dialogs/HelpDialog/index.tsx
index 8e9ea7a741..31ff86a96c 100644
--- a/src/components/Dialogs/HelpDialog/index.tsx
+++ b/src/components/Dialogs/HelpDialog/index.tsx
@@ -23,11 +23,17 @@ const ReadTime = () => (
<>
} weight="md">
-
+
-
+
>
@@ -41,7 +47,10 @@ const ReadCount = () => (
-
+
>
diff --git a/src/components/Search/SearchBar/styles.css b/src/components/Search/SearchBar/styles.css
index f8bc2fa106..87ae39e625 100644
--- a/src/components/Search/SearchBar/styles.css
+++ b/src/components/Search/SearchBar/styles.css
@@ -20,13 +20,11 @@ form {
font-size: var(--font-size-sm);
color: var(--color-black);
text-overflow: ellipsis;
- background-color: var(--color-grey-lighter);
border: 1px solid var(--color-line-grey-light);
border-radius: var(--search-bar-height);
transition-property: border-color, background-color;
&:focus {
- background-color: var(--color-green-lighter);
border: 1px solid var(--color-matters-green);
}
From 31ae44c42355a71b7564c7abb033621279d42f59 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 31 Mar 2023 16:15:23 +0800
Subject: [PATCH 44/92] fix(SearchSelect): fix Pingyin input errors
---
.../SearchingArea/SearchInput/index.tsx | 118 ++++++++++--------
1 file changed, 66 insertions(+), 52 deletions(-)
diff --git a/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx b/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
index f1551bd707..8a324cfe9a 100644
--- a/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
+++ b/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
@@ -1,4 +1,5 @@
import VisuallyHidden from '@reach/visually-hidden'
+import { Formik } from 'formik'
import { useContext } from 'react'
import { translate } from '~/common/utils'
@@ -13,8 +14,8 @@ export interface SearchInputProps {
value: string
onChange: (value: string) => void
onSubmit: (value: string) => void
- onFocus: () => void
- onBlur: () => void
+ onFocus?: () => void
+ onBlur?: () => void
autoFocus?: boolean
}
@@ -58,59 +59,72 @@ const SearchInput: React.FC = ({
}
return (
-
+ {value && (
+ {
+ onChange('')
+ setValues({ q: '' })
+ }}
+ >
+
+
+ )}
+
+
+ )
+ }}
+
)
}
From c1c09347c79f7d68b361e74dbc599709a16405f9 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 31 Mar 2023 16:18:46 +0800
Subject: [PATCH 45/92] feat(SearchInput): revise copy
---
.../SearchSelect/SearchingArea/SearchInput/index.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx b/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
index 8a324cfe9a..c1d5f59db2 100644
--- a/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
+++ b/src/components/SearchSelect/SearchingArea/SearchInput/index.tsx
@@ -33,9 +33,9 @@ const SearchInput: React.FC = ({
const textAriaLabel = translate({ id: 'search', lang })
const textPlaceholder = {
Article: translate({
- zh_hant: '搜尋作品標題',
- zh_hans: '搜索作品标题',
- en: 'Search articles',
+ zh_hant: '輸入文章標題或粘貼文章鏈接',
+ zh_hans: '输入文章标题或粘贴文章链接',
+ en: 'Enter article title or paste article link',
lang,
}),
Tag: translate({
From 621eed9ffceab082de9b1d7b2f762a93e60e0d93 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 31 Mar 2023 16:21:06 +0800
Subject: [PATCH 46/92] feat(Editor): remove unused code in EditorSearchingArea
---
.../Forms/EditorSearchSelectForm/index.tsx | 3 -
.../SearchingArea/EditorSearchingArea.tsx | 117 +++++-------------
2 files changed, 34 insertions(+), 86 deletions(-)
diff --git a/src/components/Forms/EditorSearchSelectForm/index.tsx b/src/components/Forms/EditorSearchSelectForm/index.tsx
index b027e38467..6f662d0fc2 100644
--- a/src/components/Forms/EditorSearchSelectForm/index.tsx
+++ b/src/components/Forms/EditorSearchSelectForm/index.tsx
@@ -56,7 +56,6 @@ export type EditorSearchSelectFormProps = {
draggable?: boolean
createTag?: boolean
- inviteEmail?: boolean
CustomStagingArea?: (props: CustomStagingAreaProps) => JSX.Element
}
@@ -80,7 +79,6 @@ const EditorSearchSelectForm = ({
draggable,
createTag,
- inviteEmail,
}: EditorSearchSelectFormProps) => {
const initStagingNodes =
nodes?.map((node) => ({ node, selected: true })) || []
@@ -179,7 +177,6 @@ const EditorSearchSelectForm = ({
toSearchingArea={toSearchingArea}
addNodeToStaging={addNodeToStaging}
createTag={createTag}
- inviteEmail={inviteEmail}
CustomStagingArea={
CustomStagingArea && (
void
createTag?: boolean
- inviteEmail?: boolean
CustomStagingArea?: React.ReactNode
} & Pick
@@ -84,13 +80,11 @@ const EditorSearchingArea: React.FC = ({
addNodeToStaging,
createTag,
- inviteEmail,
CustomStagingArea,
}) => {
const viewer = useContext(ViewerContext)
const isArticle = searchType === 'Article'
- const isUser = searchType === 'User' || searchType === 'Invitee'
const isTag = searchType === 'Tag'
const hasListMode = viewer.id === searchFilter?.authorId && isArticle
const [mode, setMode] = useState(hasListMode ? 'list' : 'search')
@@ -128,7 +122,7 @@ const EditorSearchingArea: React.FC = ({
// load next page
const loadMore = async () => {
analytics.trackEvent('load_more', {
- type: isArticle ? 'search_article' : isTag ? 'search_tag' : 'search_user',
+ type: isArticle ? 'search_article' : 'search_tag',
location: searchEdges?.length || 0,
})
@@ -162,7 +156,7 @@ const EditorSearchingArea: React.FC = ({
.filter((node) => node.articleState === 'active') || []
const listNodeIds = listNode.map((n) => n.id).join(',')
const search = (key: string) => {
- const type = searchType === 'Invitee' ? 'User' : searchType
+ const type = searchType
lazySearch({
variables: {
key,
@@ -181,32 +175,9 @@ const EditorSearchingArea: React.FC = ({
if (hasListMode) {
setMode(value ? 'search' : 'list')
- toSearchingArea()
return
}
}
- const onSearchInputFocus = () => {
- if (hasListMode) {
- if (!searchKey) {
- setMode('list')
- }
- } else if (searchingNodes.length <= 0) {
- return
- }
-
- toSearchingArea()
- }
- const onSearchInputBlur = () => {
- if (isSearchMode) {
- return
- }
-
- // to prevent clicking node doesn't work
- setTimeout(() => {
- toStagingArea()
- }, 100)
- }
-
// searching
useEffect(() => {
if (debouncedSearchKey) {
@@ -231,7 +202,6 @@ const EditorSearchingArea: React.FC = ({
} else {
loadList()
}
- toSearchingArea()
}, [isListMode])
useEffect(() => {
@@ -248,11 +218,6 @@ const EditorSearchingArea: React.FC = ({
!searchNodes.some(
(node) => node.__typename === 'Tag' && node.content === searchKey
)
- const canInviteEmail =
- isUser &&
- inviteEmail &&
- searchKey &&
- isValidEmail(searchKey.trim(), { allowPlusSign: false })
/**
* Render
@@ -264,8 +229,6 @@ const EditorSearchingArea: React.FC = ({
value={searchKey}
onChange={onSearchInputChange}
onSubmit={search}
- onFocus={onSearchInputFocus}
- onBlur={onSearchInputBlur}
autoFocus
/>
@@ -276,50 +239,38 @@ const EditorSearchingArea: React.FC = ({
{/* Search */}
{searchKey.length > 0 && (
<>
- {isSearchMode &&
- !searching &&
- !hasNodes &&
- !canCreateTag &&
- !canInviteEmail && }
-
- {isSearchMode &&
- !searching &&
- (hasNodes || canCreateTag || canInviteEmail) && (
-
-
- {canCreateTag && (
- -
-
-
- )}
- {canInviteEmail && (
- -
-
-
- )}
-
- {searchingNodes.map((node) => (
- -
-
-
- ))}
-
-
- )}
+ {isSearchMode && !searching && !hasNodes && !canCreateTag && (
+
+ )}
+
+ {isSearchMode && !searching && (hasNodes || canCreateTag) && (
+
+
+ {canCreateTag && (
+ -
+
+
+ )}
+
+ {searchingNodes.map((node) => (
+ -
+
+
+ ))}
+
+
+ )}
{/* List */}
{isListMode && !searching && !haslistNode && }
From c402d624b1f4cef0c1292a713fdf50bf44d1a229 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Fri, 31 Mar 2023 15:25:38 +0700
Subject: [PATCH 47/92] feat(nav): revise sidebar & navbar
---
.../icons/24px/nav-following-active.svg | 6 -
public/static/icons/24px/nav-following.svg | 6 -
public/static/icons/24px/nav-home-active.svg | 5 -
public/static/icons/24px/nav-home.svg | 3 -
.../icons/24px/nav-notification-active.svg | 5 -
public/static/icons/24px/nav-notification.svg | 5 -
.../static/icons/24px/nav-search-active.svg | 4 -
public/static/icons/24px/nav-search.svg | 4 -
public/static/icons/24px/nav-settings.svg | 4 -
public/static/icons/32px/nav-create.svg | 3 +
.../icons/32px/nav-following-active.svg | 3 +
public/static/icons/32px/nav-following.svg | 3 +
public/static/icons/32px/nav-home-active.svg | 3 +
public/static/icons/32px/nav-home.svg | 3 +
public/static/icons/32px/nav-me-active.svg | 7 +
public/static/icons/32px/nav-me.svg | 3 +
.../icons/32px/nav-notification-active.svg | 3 +
public/static/icons/32px/nav-notification.svg | 3 +
.../static/icons/32px/nav-search-active.svg | 3 +
public/static/icons/32px/nav-search.svg | 3 +
src/components/Button/index.tsx | 1 +
.../Buttons/UniversalAuth/index.tsx | 40 ++--
src/components/Buttons/Write/index.tsx | 73 ++++---
src/components/Dialogs/HelpDialog/index.tsx | 15 +-
src/components/Empty/EmptyNotice.tsx | 4 +-
src/components/Empty/EmptySearch.tsx | 4 +-
src/components/Icon/IconLogo.tsx | 2 +-
src/components/Icon/IconNavCreate32.tsx | 5 +
src/components/Icon/IconNavFollowing24.tsx | 5 -
src/components/Icon/IconNavFollowing32.tsx | 5 +
.../Icon/IconNavFollowingActive24.tsx | 5 -
.../Icon/IconNavFollowingActive32.tsx | 5 +
src/components/Icon/IconNavHome24.tsx | 5 -
src/components/Icon/IconNavHome32.tsx | 5 +
src/components/Icon/IconNavHomeActive24.tsx | 5 -
src/components/Icon/IconNavHomeActive32.tsx | 5 +
src/components/Icon/IconNavMe32.tsx | 5 +
src/components/Icon/IconNavMeActive32.tsx | 5 +
src/components/Icon/IconNavNotification24.tsx | 5 -
src/components/Icon/IconNavNotification32.tsx | 5 +
.../Icon/IconNavNotificationActive24.tsx | 5 -
.../Icon/IconNavNotificationActive32.tsx | 5 +
src/components/Icon/IconNavSearch24.tsx | 5 -
src/components/Icon/IconNavSearch32.tsx | 5 +
src/components/Icon/IconNavSearchActive32.tsx | 5 +
src/components/Icon/IconNavSettings24.tsx | 5 -
src/components/Icon/index.tsx | 19 +-
src/components/Layout/AuthHeader/index.tsx | 45 +---
src/components/Layout/AuthHeader/styles.css | 3 -
src/components/Layout/NavBar/NavListItem.tsx | 1 +
src/components/Layout/NavBar/index.tsx | 87 +++++---
src/components/Layout/SideNav/NavListItem.tsx | 4 +-
src/components/Layout/SideNav/index.tsx | 195 ++++++++++--------
src/components/Layout/SideNav/styles.css | 2 +-
src/components/Layout/UnreadIcon/Follow.tsx | 8 +-
.../Layout/UnreadIcon/Notification.tsx | 8 +-
src/stories/components/Button/Buttons.tsx | 8 +-
.../Me/Settings/AnonymousSettings/index.tsx | 2 -
58 files changed, 357 insertions(+), 338 deletions(-)
delete mode 100644 public/static/icons/24px/nav-following-active.svg
delete mode 100644 public/static/icons/24px/nav-following.svg
delete mode 100644 public/static/icons/24px/nav-home-active.svg
delete mode 100644 public/static/icons/24px/nav-home.svg
delete mode 100644 public/static/icons/24px/nav-notification-active.svg
delete mode 100644 public/static/icons/24px/nav-notification.svg
delete mode 100644 public/static/icons/24px/nav-search-active.svg
delete mode 100644 public/static/icons/24px/nav-search.svg
delete mode 100644 public/static/icons/24px/nav-settings.svg
create mode 100644 public/static/icons/32px/nav-create.svg
create mode 100644 public/static/icons/32px/nav-following-active.svg
create mode 100644 public/static/icons/32px/nav-following.svg
create mode 100644 public/static/icons/32px/nav-home-active.svg
create mode 100644 public/static/icons/32px/nav-home.svg
create mode 100644 public/static/icons/32px/nav-me-active.svg
create mode 100644 public/static/icons/32px/nav-me.svg
create mode 100644 public/static/icons/32px/nav-notification-active.svg
create mode 100644 public/static/icons/32px/nav-notification.svg
create mode 100644 public/static/icons/32px/nav-search-active.svg
create mode 100644 public/static/icons/32px/nav-search.svg
create mode 100644 src/components/Icon/IconNavCreate32.tsx
delete mode 100644 src/components/Icon/IconNavFollowing24.tsx
create mode 100644 src/components/Icon/IconNavFollowing32.tsx
delete mode 100644 src/components/Icon/IconNavFollowingActive24.tsx
create mode 100644 src/components/Icon/IconNavFollowingActive32.tsx
delete mode 100644 src/components/Icon/IconNavHome24.tsx
create mode 100644 src/components/Icon/IconNavHome32.tsx
delete mode 100644 src/components/Icon/IconNavHomeActive24.tsx
create mode 100644 src/components/Icon/IconNavHomeActive32.tsx
create mode 100644 src/components/Icon/IconNavMe32.tsx
create mode 100644 src/components/Icon/IconNavMeActive32.tsx
delete mode 100644 src/components/Icon/IconNavNotification24.tsx
create mode 100644 src/components/Icon/IconNavNotification32.tsx
delete mode 100644 src/components/Icon/IconNavNotificationActive24.tsx
create mode 100644 src/components/Icon/IconNavNotificationActive32.tsx
delete mode 100644 src/components/Icon/IconNavSearch24.tsx
create mode 100644 src/components/Icon/IconNavSearch32.tsx
create mode 100644 src/components/Icon/IconNavSearchActive32.tsx
delete mode 100644 src/components/Icon/IconNavSettings24.tsx
delete mode 100644 src/components/Layout/AuthHeader/styles.css
diff --git a/public/static/icons/24px/nav-following-active.svg b/public/static/icons/24px/nav-following-active.svg
deleted file mode 100644
index 02d6c216aa..0000000000
--- a/public/static/icons/24px/nav-following-active.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-following.svg b/public/static/icons/24px/nav-following.svg
deleted file mode 100644
index 643f64e312..0000000000
--- a/public/static/icons/24px/nav-following.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-home-active.svg b/public/static/icons/24px/nav-home-active.svg
deleted file mode 100644
index 45819bb171..0000000000
--- a/public/static/icons/24px/nav-home-active.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-home.svg b/public/static/icons/24px/nav-home.svg
deleted file mode 100644
index 9f03b03337..0000000000
--- a/public/static/icons/24px/nav-home.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-notification-active.svg b/public/static/icons/24px/nav-notification-active.svg
deleted file mode 100644
index a6cc878ca2..0000000000
--- a/public/static/icons/24px/nav-notification-active.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-notification.svg b/public/static/icons/24px/nav-notification.svg
deleted file mode 100644
index 17a31296c8..0000000000
--- a/public/static/icons/24px/nav-notification.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-search-active.svg b/public/static/icons/24px/nav-search-active.svg
deleted file mode 100644
index 995513dcd0..0000000000
--- a/public/static/icons/24px/nav-search-active.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-search.svg b/public/static/icons/24px/nav-search.svg
deleted file mode 100644
index 81d36ebf4b..0000000000
--- a/public/static/icons/24px/nav-search.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/public/static/icons/24px/nav-settings.svg b/public/static/icons/24px/nav-settings.svg
deleted file mode 100644
index 362b7a9177..0000000000
--- a/public/static/icons/24px/nav-settings.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/public/static/icons/32px/nav-create.svg b/public/static/icons/32px/nav-create.svg
new file mode 100644
index 0000000000..35f14ed3bd
--- /dev/null
+++ b/public/static/icons/32px/nav-create.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-following-active.svg b/public/static/icons/32px/nav-following-active.svg
new file mode 100644
index 0000000000..2579d3b29c
--- /dev/null
+++ b/public/static/icons/32px/nav-following-active.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-following.svg b/public/static/icons/32px/nav-following.svg
new file mode 100644
index 0000000000..fd2de5ed67
--- /dev/null
+++ b/public/static/icons/32px/nav-following.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-home-active.svg b/public/static/icons/32px/nav-home-active.svg
new file mode 100644
index 0000000000..f7c3e32bdf
--- /dev/null
+++ b/public/static/icons/32px/nav-home-active.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-home.svg b/public/static/icons/32px/nav-home.svg
new file mode 100644
index 0000000000..6f124ae344
--- /dev/null
+++ b/public/static/icons/32px/nav-home.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-me-active.svg b/public/static/icons/32px/nav-me-active.svg
new file mode 100644
index 0000000000..1ae619b182
--- /dev/null
+++ b/public/static/icons/32px/nav-me-active.svg
@@ -0,0 +1,7 @@
+
diff --git a/public/static/icons/32px/nav-me.svg b/public/static/icons/32px/nav-me.svg
new file mode 100644
index 0000000000..c910a0b7b0
--- /dev/null
+++ b/public/static/icons/32px/nav-me.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-notification-active.svg b/public/static/icons/32px/nav-notification-active.svg
new file mode 100644
index 0000000000..12310c1810
--- /dev/null
+++ b/public/static/icons/32px/nav-notification-active.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-notification.svg b/public/static/icons/32px/nav-notification.svg
new file mode 100644
index 0000000000..2333d8114f
--- /dev/null
+++ b/public/static/icons/32px/nav-notification.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-search-active.svg b/public/static/icons/32px/nav-search-active.svg
new file mode 100644
index 0000000000..995584d876
--- /dev/null
+++ b/public/static/icons/32px/nav-search-active.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/static/icons/32px/nav-search.svg b/public/static/icons/32px/nav-search.svg
new file mode 100644
index 0000000000..5401290193
--- /dev/null
+++ b/public/static/icons/32px/nav-search.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx
index 9b9936a8d4..10afe6fbbc 100644
--- a/src/components/Button/index.tsx
+++ b/src/components/Button/index.tsx
@@ -12,6 +12,7 @@ export type ButtonWidth =
| '5rem'
| '6rem'
| '7rem'
+ | '7.5rem'
| '8rem'
| '10.5rem'
| '19.5rem'
diff --git a/src/components/Buttons/UniversalAuth/index.tsx b/src/components/Buttons/UniversalAuth/index.tsx
index 7b888cdcb6..35b5d9fb41 100644
--- a/src/components/Buttons/UniversalAuth/index.tsx
+++ b/src/components/Buttons/UniversalAuth/index.tsx
@@ -8,13 +8,11 @@ import {
import { analytics, appendTarget } from '~/common/utils'
import { Button, ButtonProps, Media, TextIcon, Translate } from '~/components'
-type UniversalAuthButtonProps = {
- isPlain?: boolean
-} & Pick
+type UniversalAuthButtonProps = Pick
export const UniversalAuthButton: React.FC<
React.PropsWithChildren
-> = ({ children, isPlain, size }) => {
+> = ({ children, size }) => {
const smUpProps = {
onClick: () => {
analytics.trackEvent('click_button', {
@@ -33,26 +31,6 @@ export const UniversalAuthButton: React.FC<
},
}
- if (isPlain) {
- return (
- <>
-
- {children}
-
-
-
- {children}
-
-
- >
- )
- }
-
- const buttonProps: ButtonProps = {
- bgColor: 'green',
- size: size || [null, '2rem'],
- spacing: [0, 'loose'],
- }
const ButtonText = () => (
@@ -61,13 +39,19 @@ export const UniversalAuthButton: React.FC<
return (
<>
-
-
+
+
-
-
+
+
+
diff --git a/src/components/Buttons/Write/index.tsx b/src/components/Buttons/Write/index.tsx
index a43fdca163..99b670f9fe 100644
--- a/src/components/Buttons/Write/index.tsx
+++ b/src/components/Buttons/Write/index.tsx
@@ -10,10 +10,9 @@ import {
import { analytics, toPath, translate } from '~/common/utils'
import {
Button,
- IconPen16,
+ IconNavCreate32,
IconSpinner16,
LanguageContext,
- Media,
TextIcon,
Translate,
useMutation,
@@ -22,55 +21,63 @@ import CREATE_DRAFT from '~/components/GQL/mutations/createDraft'
import { CreateDraftMutation } from '~/gql/graphql'
interface Props {
+ variant: 'navbar' | 'sidenav'
allowed: boolean
authed?: boolean
forbidden?: boolean
}
const BaseWriteButton = ({
+ variant,
onClick,
loading,
}: {
+ variant: 'navbar' | 'sidenav'
onClick: () => any
loading?: boolean
}) => {
const { lang } = useContext(LanguageContext)
- const WriteIcon = loading ? (
-
- ) : (
-
- )
+ if (variant === 'navbar') {
+ return (
+
+
+
+ )
+ }
return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
- >
+
+
+ ) : (
+
+ )
+ }
+ spacing="xtight"
+ weight="md"
+ color="white"
+ >
+
+
+
)
}
-export const WriteButton = ({ allowed, authed, forbidden }: Props) => {
+export const WriteButton = ({ variant, allowed, authed, forbidden }: Props) => {
const router = useRouter()
const { lang } = useContext(LanguageContext)
const [putDraft, { loading }] = useMutation(
@@ -83,6 +90,7 @@ export const WriteButton = ({ allowed, authed, forbidden }: Props) => {
if (!allowed) {
return (
window.dispatchEvent(new CustomEvent(OPEN_LIKE_COIN_DIALOG, {}))
}
@@ -92,6 +100,7 @@ export const WriteButton = ({ allowed, authed, forbidden }: Props) => {
return (
{
if (!authed) {
window.dispatchEvent(
diff --git a/src/components/Dialogs/HelpDialog/index.tsx b/src/components/Dialogs/HelpDialog/index.tsx
index 8e9ea7a741..31ff86a96c 100644
--- a/src/components/Dialogs/HelpDialog/index.tsx
+++ b/src/components/Dialogs/HelpDialog/index.tsx
@@ -23,11 +23,17 @@ const ReadTime = () => (
<>
} weight="md">
-
+
-
+
>
@@ -41,7 +47,10 @@ const ReadCount = () => (
-
+
>
diff --git a/src/components/Empty/EmptyNotice.tsx b/src/components/Empty/EmptyNotice.tsx
index ab2dd8b8f3..34fb0db216 100644
--- a/src/components/Empty/EmptyNotice.tsx
+++ b/src/components/Empty/EmptyNotice.tsx
@@ -1,8 +1,8 @@
-import { Empty, IconNavNotification24, Translate } from '~/components'
+import { Empty, IconNavNotification32, Translate } from '~/components'
export const EmptyNotice = () => (
}
+ icon={}
description={
(
}
+ icon={}
description={description || }
/>
)
diff --git a/src/components/Icon/IconLogo.tsx b/src/components/Icon/IconLogo.tsx
index 0a63ae5ab0..0377a85f20 100644
--- a/src/components/Icon/IconLogo.tsx
+++ b/src/components/Icon/IconLogo.tsx
@@ -3,5 +3,5 @@ import { ReactComponent as Icon } from '@/public/static/icons/logo.svg'
import { withIcon } from './withIcon'
export const IconLogo = withIcon((props) => (
-
+
))
diff --git a/src/components/Icon/IconNavCreate32.tsx b/src/components/Icon/IconNavCreate32.tsx
new file mode 100644
index 0000000000..5a1e77e527
--- /dev/null
+++ b/src/components/Icon/IconNavCreate32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-create.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavCreate32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavFollowing24.tsx b/src/components/Icon/IconNavFollowing24.tsx
deleted file mode 100644
index 5dfb2774ed..0000000000
--- a/src/components/Icon/IconNavFollowing24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-following.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavFollowing24 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavFollowing32.tsx b/src/components/Icon/IconNavFollowing32.tsx
new file mode 100644
index 0000000000..47b1350121
--- /dev/null
+++ b/src/components/Icon/IconNavFollowing32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-following.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavFollowing32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavFollowingActive24.tsx b/src/components/Icon/IconNavFollowingActive24.tsx
deleted file mode 100644
index 1db982e251..0000000000
--- a/src/components/Icon/IconNavFollowingActive24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-following-active.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavFollowingActive24 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavFollowingActive32.tsx b/src/components/Icon/IconNavFollowingActive32.tsx
new file mode 100644
index 0000000000..af54a518a5
--- /dev/null
+++ b/src/components/Icon/IconNavFollowingActive32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-following-active.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavFollowingActive32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavHome24.tsx b/src/components/Icon/IconNavHome24.tsx
deleted file mode 100644
index e63f46ef34..0000000000
--- a/src/components/Icon/IconNavHome24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-home.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavHome24 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavHome32.tsx b/src/components/Icon/IconNavHome32.tsx
new file mode 100644
index 0000000000..b1b20bf1e1
--- /dev/null
+++ b/src/components/Icon/IconNavHome32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-home.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavHome32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavHomeActive24.tsx b/src/components/Icon/IconNavHomeActive24.tsx
deleted file mode 100644
index d78a49d64f..0000000000
--- a/src/components/Icon/IconNavHomeActive24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-home-active.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavHomeActive24 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavHomeActive32.tsx b/src/components/Icon/IconNavHomeActive32.tsx
new file mode 100644
index 0000000000..2ec1f79710
--- /dev/null
+++ b/src/components/Icon/IconNavHomeActive32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-home-active.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavHomeActive32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavMe32.tsx b/src/components/Icon/IconNavMe32.tsx
new file mode 100644
index 0000000000..5ffe7119e3
--- /dev/null
+++ b/src/components/Icon/IconNavMe32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-me.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavMe32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavMeActive32.tsx b/src/components/Icon/IconNavMeActive32.tsx
new file mode 100644
index 0000000000..55d24da2e1
--- /dev/null
+++ b/src/components/Icon/IconNavMeActive32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-me-active.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavMeActive32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavNotification24.tsx b/src/components/Icon/IconNavNotification24.tsx
deleted file mode 100644
index 5b0d060c15..0000000000
--- a/src/components/Icon/IconNavNotification24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-notification.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavNotification24 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavNotification32.tsx b/src/components/Icon/IconNavNotification32.tsx
new file mode 100644
index 0000000000..9e7d6bdb6c
--- /dev/null
+++ b/src/components/Icon/IconNavNotification32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-notification.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavNotification32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavNotificationActive24.tsx b/src/components/Icon/IconNavNotificationActive24.tsx
deleted file mode 100644
index 2c2a3f8e5e..0000000000
--- a/src/components/Icon/IconNavNotificationActive24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-notification-active.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavNotificationActive24 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavNotificationActive32.tsx b/src/components/Icon/IconNavNotificationActive32.tsx
new file mode 100644
index 0000000000..8704263511
--- /dev/null
+++ b/src/components/Icon/IconNavNotificationActive32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-notification-active.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavNotificationActive32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavSearch24.tsx b/src/components/Icon/IconNavSearch24.tsx
deleted file mode 100644
index 6b0b0ea040..0000000000
--- a/src/components/Icon/IconNavSearch24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-search.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavSearch24 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavSearch32.tsx b/src/components/Icon/IconNavSearch32.tsx
new file mode 100644
index 0000000000..9b7fab5161
--- /dev/null
+++ b/src/components/Icon/IconNavSearch32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-search.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavSearch32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavSearchActive32.tsx b/src/components/Icon/IconNavSearchActive32.tsx
new file mode 100644
index 0000000000..4736aa10a6
--- /dev/null
+++ b/src/components/Icon/IconNavSearchActive32.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/32px/nav-search-active.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconNavSearchActive32 = withIcon(Icon)
diff --git a/src/components/Icon/IconNavSettings24.tsx b/src/components/Icon/IconNavSettings24.tsx
deleted file mode 100644
index ccc39cc5b6..0000000000
--- a/src/components/Icon/IconNavSettings24.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ReactComponent as Icon } from '@/public/static/icons/24px/nav-settings.svg'
-
-import { withIcon } from './withIcon'
-
-export const IconNavSettings24 = withIcon(Icon)
diff --git a/src/components/Icon/index.tsx b/src/components/Icon/index.tsx
index a258a9825b..5ddf1a10ef 100644
--- a/src/components/Icon/index.tsx
+++ b/src/components/Icon/index.tsx
@@ -98,14 +98,17 @@ export * from './IconMetaMask24'
export * from './IconMore16'
export * from './IconMore32'
export * from './IconMute24'
-export * from './IconNavFollowing24'
-export * from './IconNavFollowingActive24'
-export * from './IconNavHome24'
-export * from './IconNavHomeActive24'
-export * from './IconNavNotification24'
-export * from './IconNavNotificationActive24'
-export * from './IconNavSearch24'
-export * from './IconNavSettings24'
+export * from './IconNavCreate32'
+export * from './IconNavFollowing32'
+export * from './IconNavFollowingActive32'
+export * from './IconNavHome32'
+export * from './IconNavHomeActive32'
+export * from './IconNavMe32'
+export * from './IconNavMeActive32'
+export * from './IconNavNotification32'
+export * from './IconNavNotificationActive32'
+export * from './IconNavSearch32'
+export * from './IconNavSearchActive32'
export * from './IconPayout24'
export * from './IconPaywall16'
export * from './IconPen16'
diff --git a/src/components/Layout/AuthHeader/index.tsx b/src/components/Layout/AuthHeader/index.tsx
index dd809ad807..2a79deb53c 100644
--- a/src/components/Layout/AuthHeader/index.tsx
+++ b/src/components/Layout/AuthHeader/index.tsx
@@ -1,46 +1,12 @@
import { useContext } from 'react'
import { TextId } from '~/common/enums'
-import {
- ConnectWalletButton,
- IconLogo,
- Layout,
- Media,
- UniversalAuthButton,
- ViewerContext,
-} from '~/components'
-
-import styles from './styles.css'
+import { ConnectWalletButton, Layout, Media, ViewerContext } from '~/components'
type HeaderProps = {
title: TextId
}
-const AnnonmousHeader: React.FC = ({ title }) => {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- }
- />
- )
-}
-
const AuthedHeader: React.FC = ({ title }) => {
const viewer = useContext(ViewerContext)
const showConnect = viewer.isAuthed && !viewer.info.ethAddress
@@ -52,6 +18,7 @@ const AuthedHeader: React.FC = ({ title }) => {
right={
<>
+
{showConnect && }
>
}
@@ -61,13 +28,7 @@ const AuthedHeader: React.FC = ({ title }) => {
}
const AuthHeader: React.FC = ({ title }) => {
- const viewer = useContext(ViewerContext)
-
- if (viewer.isAuthed) {
- return
- }
-
- return
+ return
}
export default AuthHeader
diff --git a/src/components/Layout/AuthHeader/styles.css b/src/components/Layout/AuthHeader/styles.css
deleted file mode 100644
index 77d0288f2d..0000000000
--- a/src/components/Layout/AuthHeader/styles.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.logo {
- display: inline-flex;
-}
diff --git a/src/components/Layout/NavBar/NavListItem.tsx b/src/components/Layout/NavBar/NavListItem.tsx
index 5da2bee002..9a0d48dd54 100644
--- a/src/components/Layout/NavBar/NavListItem.tsx
+++ b/src/components/Layout/NavBar/NavListItem.tsx
@@ -40,6 +40,7 @@ const NavListItem = ({
onClick={onClick}
>
{active ? activeIcon : icon}
+
{name}
diff --git a/src/components/Layout/NavBar/index.tsx b/src/components/Layout/NavBar/index.tsx
index a83522d902..78050f349e 100644
--- a/src/components/Layout/NavBar/index.tsx
+++ b/src/components/Layout/NavBar/index.tsx
@@ -3,11 +3,12 @@ import { useContext } from 'react'
import { PATHS, TEXT } from '~/common/enums'
import { toPath } from '~/common/utils'
import {
- IconNavHome24,
- IconNavHomeActive24,
- IconNavSearch24,
- IconNavSettings24,
+ IconNavHome32,
+ IconNavHomeActive32,
+ IconNavSearch32,
+ IconNavSearchActive32,
LanguageContext,
+ UniversalAuthButton,
useRoute,
ViewerContext,
WriteButton,
@@ -24,17 +25,56 @@ const NavBar = () => {
const isInHome = isInPath('HOME')
const isInFollow = isInPath('FOLLOW')
const isInNotification = isInPath('ME_NOTIFICATIONS')
- const isInSettings = isInPath('SETTINGS')
const isInSearch = isInPath('SEARCH')
const isInDraftDetail = isInPath('ME_DRAFT_DETAIL')
+ if (!viewer.isAuthed) {
+ return (
+
+
+ }
+ activeIcon={}
+ active={isInHome}
+ href={PATHS.HOME}
+ />
+
+ -
+
+
+
+ }
+ activeIcon={}
+ active={isInSearch}
+ onClick={() => {
+ const path = toPath({
+ page: 'search',
+ })
+
+ if (isInSearch) {
+ router.replace(path.href)
+ } else {
+ router.push(path.href)
+ }
+ }}
+ />
+
+
+
+
+ )
+ }
+
return (
}
- activeIcon={}
+ icon={}
+ activeIcon={}
active={isInHome}
href={PATHS.HOME}
/>
@@ -50,6 +90,7 @@ const NavBar = () => {
{!isInDraftDetail && (
-
{
}
- activeIcon={}
+ icon={}
+ activeIcon={}
active={isInSearch}
onClick={() => {
const path = toPath({
@@ -75,26 +116,14 @@ const NavBar = () => {
}}
/>
- {viewer.isAuthed && (
- }
- activeIcon={}
- active={isInNotification}
- href={PATHS.ME_NOTIFICATIONS}
- aria-label={TEXT[lang].notifications}
- />
- )}
-
- {!viewer.isAuthed && (
- }
- activeIcon={}
- active={isInSettings}
- href={PATHS.ME_SETTINGS}
- />
- )}
+ }
+ activeIcon={}
+ active={isInNotification}
+ href={PATHS.ME_NOTIFICATIONS}
+ aria-label={TEXT[lang].notifications}
+ />
diff --git a/src/components/Layout/SideNav/NavListItem.tsx b/src/components/Layout/SideNav/NavListItem.tsx
index e3793a15d0..4100d51ce6 100644
--- a/src/components/Layout/SideNav/NavListItem.tsx
+++ b/src/components/Layout/SideNav/NavListItem.tsx
@@ -32,7 +32,7 @@ const NavListItemButton = forwardRef(
return (
{isMdUp && name}
diff --git a/src/components/Layout/SideNav/index.tsx b/src/components/Layout/SideNav/index.tsx
index f75b6f3bc9..abfdab008d 100644
--- a/src/components/Layout/SideNav/index.tsx
+++ b/src/components/Layout/SideNav/index.tsx
@@ -11,23 +11,49 @@ import {
hidePopperOnClick,
IconLogo,
IconLogoGraph,
- IconNavHome24,
- IconNavHomeActive24,
- IconNavSearch24,
- IconNavSettings24,
+ IconNavHome32,
+ IconNavHomeActive32,
+ IconNavMe32,
+ IconNavMeActive32,
+ IconNavSearch32,
+ IconNavSearchActive32,
Media,
Menu,
+ UniversalAuthButton,
useRoute,
ViewerContext,
WriteButton,
} from '~/components'
-import MeAvatar from '../MeAvatar'
import NavMenu from '../NavMenu'
import UnreadIcon from '../UnreadIcon'
import NavListItem from './NavListItem'
import styles from './styles.css'
+const Logo = () => {
+ const intl = useIntl()
+
+ return (
+
+ )
+}
+
const SideNav = () => {
const { router, isInPath, isPathStartWith, getQuery } = useRoute()
const viewer = useContext(ViewerContext)
@@ -39,37 +65,36 @@ const SideNav = () => {
const isInFollow = isInPath('FOLLOW')
const isInNotification = isInPath('ME_NOTIFICATIONS')
const isInSearch = isInPath('SEARCH')
- const isInSettings = isInPath('SETTINGS')
const isInDraftDetail = isInPath('ME_DRAFT_DETAIL')
const isInMe =
(!isInNotification && isPathStartWith('/me')) || userName === viewerUserName
- const intl = useIntl()
+ // only show auth button for anonymous
+ if (!viewer.isAuthed) {
+ return (
+
+ )
+ }
+
return (
-
+
}
- icon={}
- activeIcon={}
+ icon={}
+ activeIcon={}
active={isInHome}
href={PATHS.HOME}
/>
@@ -87,23 +112,21 @@ const SideNav = () => {
href={PATHS.FOLLOW}
/>
- {viewer.isAuthed && (
-
- }
- icon={}
- activeIcon={}
- active={isInNotification}
- href={PATHS.ME_NOTIFICATIONS}
- />
- )}
+
+ }
+ icon={}
+ activeIcon={}
+ active={isInNotification}
+ href={PATHS.ME_NOTIFICATIONS}
+ />
}
- icon={}
- activeIcon={}
+ icon={}
+ activeIcon={}
active={isInSearch}
onClick={() => {
const path = toPath({
@@ -119,61 +142,55 @@ const SideNav = () => {
/>
- {!viewer.isAuthed && (
+
+
+
+ }
+ placement="right-start"
+ appendTo={typeof window !== 'undefined' ? document.body : undefined}
+ offset={[-24, 24]}
+ zIndex={Z_INDEX.OVER_BOTTOM_BAR}
+ onShown={hidePopperOnClick}
+ >
}
- icon={}
- activeIcon={}
- active={isInSettings}
- href={PATHS.ME_SETTINGS}
+ name={}
+ icon={}
+ activeIcon={}
+ active={isInMe}
+ canScrollTop={false}
+ aira-haspopup="menu"
/>
- )}
-
- {viewer.isAuthed && (
-
-
-
- }
- placement="right-start"
- appendTo={typeof window !== 'undefined' ? document.body : undefined}
- offset={[-24, 24]}
- zIndex={Z_INDEX.OVER_BOTTOM_BAR}
- onShown={hidePopperOnClick}
- >
-
- }
- icon={}
- activeIcon={}
- active={isInMe}
- canScrollTop={false}
- aira-haspopup="menu"
- />
-
- )}
+
{!isInDraftDetail && (
-
-
+
+
+
+
+
+
)}
diff --git a/src/components/Layout/SideNav/styles.css b/src/components/Layout/SideNav/styles.css
index 6fed440c08..febb4c8172 100644
--- a/src/components/Layout/SideNav/styles.css
+++ b/src/components/Layout/SideNav/styles.css
@@ -31,7 +31,7 @@ ul {
}
& li {
- margin-top: var(--spacing-xx-loose);
+ margin-top: var(--spacing-x-loose);
font-size: 0;
}
}
diff --git a/src/components/Layout/UnreadIcon/Follow.tsx b/src/components/Layout/UnreadIcon/Follow.tsx
index 7c4059e0cb..7865842a7d 100644
--- a/src/components/Layout/UnreadIcon/Follow.tsx
+++ b/src/components/Layout/UnreadIcon/Follow.tsx
@@ -3,8 +3,8 @@ import classNames from 'classnames'
import { useContext, useEffect } from 'react'
import {
- IconNavFollowing24,
- IconNavFollowingActive24,
+ IconNavFollowing32,
+ IconNavFollowingActive32,
ViewerContext,
} from '~/components'
import UNREAD_FOLLOWING from '~/components/GQL/queries/unreadFollowing'
@@ -40,9 +40,9 @@ const FollowUnreadIcon: React.FC = ({ active }) => {
return (
{active ? (
-
+
) : (
-
+
)}
diff --git a/src/components/Layout/UnreadIcon/Notification.tsx b/src/components/Layout/UnreadIcon/Notification.tsx
index 370f465ce8..8a468db317 100644
--- a/src/components/Layout/UnreadIcon/Notification.tsx
+++ b/src/components/Layout/UnreadIcon/Notification.tsx
@@ -3,8 +3,8 @@ import classNames from 'classnames'
import { useContext, useEffect } from 'react'
import {
- IconNavNotification24,
- IconNavNotificationActive24,
+ IconNavNotification32,
+ IconNavNotificationActive32,
ViewerContext,
} from '~/components'
import { UNREAD_NOTICE_COUNT } from '~/components/GQL/queries/notice'
@@ -40,9 +40,9 @@ const NotificationUnreadIcon: React.FC = ({ active }) => {
return (
{active ? (
-
+
) : (
-
+
)}
diff --git a/src/stories/components/Button/Buttons.tsx b/src/stories/components/Button/Buttons.tsx
index 088b2fd722..95e5eff6e1 100644
--- a/src/stories/components/Button/Buttons.tsx
+++ b/src/stories/components/Button/Buttons.tsx
@@ -5,7 +5,7 @@ import {
Button,
Dialog,
IconMore16,
- IconNavSearch24,
+ IconNavSearch32,
LoginButton,
Translate,
ViewMoreButton,
@@ -35,7 +35,7 @@ const Buttons = () => (
-
+
@@ -45,8 +45,8 @@ const Buttons = () => (
}
- activeIcon={}
+ icon={}
+ activeIcon={}
active
/>
diff --git a/src/views/Me/Settings/AnonymousSettings/index.tsx b/src/views/Me/Settings/AnonymousSettings/index.tsx
index 9d7af5ddcc..9dcfff7eac 100644
--- a/src/views/Me/Settings/AnonymousSettings/index.tsx
+++ b/src/views/Me/Settings/AnonymousSettings/index.tsx
@@ -12,8 +12,6 @@ const Settings = () => {
-
-
From c876682eb047126bf0341f8c0d8842a183591b1e Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Fri, 31 Mar 2023 16:02:42 +0700
Subject: [PATCH 48/92] feat(icon): add
---
public/static/icons/16px/create.svg | 1 +
src/components/Buttons/Write/index.tsx | 3 ++-
src/components/Icon/IconCreate16.tsx | 5 +++++
src/components/Icon/index.tsx | 1 +
4 files changed, 9 insertions(+), 1 deletion(-)
create mode 100644 public/static/icons/16px/create.svg
create mode 100644 src/components/Icon/IconCreate16.tsx
diff --git a/public/static/icons/16px/create.svg b/public/static/icons/16px/create.svg
new file mode 100644
index 0000000000..9b1133c5aa
--- /dev/null
+++ b/public/static/icons/16px/create.svg
@@ -0,0 +1 @@
+
diff --git a/src/components/Buttons/Write/index.tsx b/src/components/Buttons/Write/index.tsx
index 99b670f9fe..184fbdb091 100644
--- a/src/components/Buttons/Write/index.tsx
+++ b/src/components/Buttons/Write/index.tsx
@@ -10,6 +10,7 @@ import {
import { analytics, toPath, translate } from '~/common/utils'
import {
Button,
+ IconCreate16,
IconNavCreate32,
IconSpinner16,
LanguageContext,
@@ -64,7 +65,7 @@ const BaseWriteButton = ({
loading ? (
) : (
-
+
)
}
spacing="xtight"
diff --git a/src/components/Icon/IconCreate16.tsx b/src/components/Icon/IconCreate16.tsx
new file mode 100644
index 0000000000..d69572b858
--- /dev/null
+++ b/src/components/Icon/IconCreate16.tsx
@@ -0,0 +1,5 @@
+import { ReactComponent as Icon } from '@/public/static/icons/16px/create.svg'
+
+import { withIcon } from './withIcon'
+
+export const IconCreate16 = withIcon(Icon)
diff --git a/src/components/Icon/index.tsx b/src/components/Icon/index.tsx
index 5ddf1a10ef..f0186237a9 100644
--- a/src/components/Icon/index.tsx
+++ b/src/components/Icon/index.tsx
@@ -53,6 +53,7 @@ export * from './IconCollapse16'
export * from './IconCollection24'
export * from './IconComment16'
export * from './IconCopy16'
+export * from './IconCreate16'
export * from './IconDisableComment24'
export * from './IconDisallow16'
export * from './IconDollarCircle16'
From 7e9f8486bc0917725a9abf91daa4cc00d2607f3e Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 6 Apr 2023 15:47:53 +0800
Subject: [PATCH 49/92] feat(SearchSelect): exact matches when pasting url in
adding connection modal
---
src/common/utils/url.ts | 8 ++
src/components/Dialogs/HelpDialog/index.tsx | 15 +++-
.../SearchingArea/EditorSearchingArea.tsx | 79 +++++++++++++++----
.../SearchSelect/SearchingArea/gql.ts | 11 +++
4 files changed, 95 insertions(+), 18 deletions(-)
diff --git a/src/common/utils/url.ts b/src/common/utils/url.ts
index b3337048b2..51c5862d0e 100644
--- a/src/common/utils/url.ts
+++ b/src/common/utils/url.ts
@@ -62,3 +62,11 @@ export const toSizedImageURL = ({ url, size, ext }: ToSizedImageURLProps) => {
return assetDomain + prefix + extedUrl
}
+
+export const isUrl = (key: string) => {
+ try {
+ return Boolean(new URL(key))
+ } catch (e) {
+ return false
+ }
+}
diff --git a/src/components/Dialogs/HelpDialog/index.tsx b/src/components/Dialogs/HelpDialog/index.tsx
index 8e9ea7a741..31ff86a96c 100644
--- a/src/components/Dialogs/HelpDialog/index.tsx
+++ b/src/components/Dialogs/HelpDialog/index.tsx
@@ -23,11 +23,17 @@ const ReadTime = () => (
<>
} weight="md">
-
+
-
+
>
@@ -41,7 +47,10 @@ const ReadCount = () => (
-
+
>
diff --git a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
index 51d47aa415..cc0851c4db 100644
--- a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
+++ b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
@@ -5,8 +5,10 @@ import { useDebouncedCallback } from 'use-debounce'
import { INPUT_DEBOUNCE } from '~/common/enums'
import {
analytics,
+ isUrl,
mergeConnections,
- normalizeTagInput, // stripAllPunct, // stripPunctPrefixSuffix,
+ normalizeTagInput,
+ parseURL,
} from '~/common/utils'
import {
EmptySearch,
@@ -17,6 +19,7 @@ import {
ViewerContext,
} from '~/components'
import {
+ ArticleUrlQueryQuery,
ListViewerArticlesQuery,
SearchExclude,
SearchFilter,
@@ -26,7 +29,7 @@ import {
import SearchSelectNode from '../SearchSelectNode'
import styles from '../styles.css'
import CreateTag from './CreateTag'
-import { LIST_VIEWER_ARTICLES, SELECT_SEARCH } from './gql'
+import { ARTICLE_URL_QUERY, LIST_VIEWER_ARTICLES, SELECT_SEARCH } from './gql'
import SearchInput, {
SearchInputProps,
SearchType as SearchInputType,
@@ -67,7 +70,7 @@ type SearchingAreaProps = {
CustomStagingArea?: React.ReactNode
} & Pick
-type Mode = 'search' | 'list'
+type Mode = 'search' | 'list' | 'article_url'
const EditorSearchingArea: React.FC = ({
searchType,
@@ -90,6 +93,7 @@ const EditorSearchingArea: React.FC = ({
const [mode, setMode] = useState(hasListMode ? 'list' : 'search')
const isSearchMode = mode === 'search'
const isListMode = mode === 'list'
+ const isArticleUrlMode = mode === 'article_url'
const [searching, setSearching] = useState(false)
const [searchingNodes, setSearchingNodes] = useState([])
@@ -114,6 +118,15 @@ const EditorSearchingArea: React.FC = ({
{ data: listData, loading: listLoading, fetchMore: fetchMoreList },
] = useLazyQuery(LIST_VIEWER_ARTICLES)
+ const [
+ lazyArticleUrlQuery,
+ { data: articleUrlData, loading: articleUrlLoding },
+ ] = usePublicLazyQuery(
+ ARTICLE_URL_QUERY,
+ {},
+ { publicQuery: !viewer.isAuthed }
+ )
+
// pagination
const { edges: searchEdges, pageInfo: searchPageInfo } = data?.search || {}
const { edges: listEdges, pageInfo: listPageInfo } =
@@ -156,25 +169,43 @@ const EditorSearchingArea: React.FC = ({
.filter((node) => node.articleState === 'active') || []
const listNodeIds = listNode.map((n) => n.id).join(',')
const search = (key: string) => {
- const type = searchType
- lazySearch({
- variables: {
- key,
- type,
- filter: searchFilter,
- exclude: searchExclude,
- first: 10,
- },
- })
+ // Used to match links of the format like👇
+ // https://matters.news/@az/12-来自matters的第一封信-致好朋友-zdpuAnuMKxNv6SUj7kTRzgrWRdp9q4aMMKHJ6TGtn8tp4FwX2
+ const regex = new RegExp(
+ `^https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/@\\w+/\\d+-.+-\\w+$`
+ )
+ if (searchType === 'Article' && isUrl(key) && regex.test(key)) {
+ const urlObj = parseURL(key)
+ const paths = urlObj.pathname.split('-')
+ const mediaHash = paths?.[paths?.length - 1]
+ setMode('article_url')
+ lazyArticleUrlQuery({
+ variables: {
+ mediaHash,
+ },
+ })
+ } else {
+ const type = searchType
+ lazySearch({
+ variables: {
+ key,
+ type,
+ filter: searchFilter,
+ exclude: searchExclude,
+ first: 10,
+ },
+ })
+ }
}
// handling changes from search input
const onSearchInputChange = (value: string) => {
setSearchKey(value)
debouncedSetSearchKey(value)
+ setMode('search')
- if (hasListMode) {
- setMode(value ? 'search' : 'list')
+ if (hasListMode && !value) {
+ setMode('list')
return
}
}
@@ -209,8 +240,14 @@ const EditorSearchingArea: React.FC = ({
setSearchingNodes(listNode)
}, [listLoading, listNodeIds])
+ // article url
+ useEffect(() => {
+ setSearching(articleUrlLoding)
+ }, [articleUrlLoding])
+
const hasNodes = searchNodes.length > 0
const haslistNode = listNode.length > 0
+ const hasArticle = !!articleUrlData?.article
const canCreateTag =
isTag &&
searchKey &&
@@ -292,6 +329,18 @@ const EditorSearchingArea: React.FC = ({
)}
+
+ {isArticleUrlMode && !searching && !hasArticle && }
+
+ {isArticleUrlMode &&
+ !searching &&
+ hasArticle &&
+ articleUrlData?.article?.__typename === 'Article' && (
+
+ )}
>
)}
diff --git a/src/components/SearchSelect/SearchingArea/gql.ts b/src/components/SearchSelect/SearchingArea/gql.ts
index 4637152334..d642dac206 100644
--- a/src/components/SearchSelect/SearchingArea/gql.ts
+++ b/src/components/SearchSelect/SearchingArea/gql.ts
@@ -73,3 +73,14 @@ export const LIST_VIEWER_ARTICLES = gql`
}
${ArticleDigestDropdown.fragments.article}
`
+
+export const ARTICLE_URL_QUERY = gql`
+ query ArticleUrlQuery($mediaHash: String!) {
+ article(input: { mediaHash: $mediaHash }) {
+ ... on Article {
+ ...ArticleDigestDropdownArticle
+ }
+ }
+ }
+ ${ArticleDigestDropdown.fragments.article}
+`
From 74a9339296085c27f992fcf29ae14924d3e274ab Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 6 Apr 2023 16:23:46 +0800
Subject: [PATCH 50/92] feat(SearchSelect): query article by id
---
.../SearchingArea/EditorSearchingArea.tsx | 12 +++++++-----
src/components/SearchSelect/SearchingArea/gql.ts | 4 ++--
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
index cc0851c4db..bde07e6a14 100644
--- a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
+++ b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
@@ -9,6 +9,7 @@ import {
mergeConnections,
normalizeTagInput,
parseURL,
+ toGlobalId,
} from '~/common/utils'
import {
EmptySearch,
@@ -177,11 +178,12 @@ const EditorSearchingArea: React.FC = ({
if (searchType === 'Article' && isUrl(key) && regex.test(key)) {
const urlObj = parseURL(key)
const paths = urlObj.pathname.split('-')
- const mediaHash = paths?.[paths?.length - 1]
+ const subPaths = paths[0].split('/')
+ const articleId = subPaths?.[subPaths.length - 1]
setMode('article_url')
lazyArticleUrlQuery({
variables: {
- mediaHash,
+ id: toGlobalId({ type: 'Article', id: articleId }),
},
})
} else {
@@ -247,7 +249,7 @@ const EditorSearchingArea: React.FC = ({
const hasNodes = searchNodes.length > 0
const haslistNode = listNode.length > 0
- const hasArticle = !!articleUrlData?.article
+ const hasArticle = !!articleUrlData?.node
const canCreateTag =
isTag &&
searchKey &&
@@ -335,9 +337,9 @@ const EditorSearchingArea: React.FC = ({
{isArticleUrlMode &&
!searching &&
hasArticle &&
- articleUrlData?.article?.__typename === 'Article' && (
+ articleUrlData?.node?.__typename === 'Article' && (
)}
diff --git a/src/components/SearchSelect/SearchingArea/gql.ts b/src/components/SearchSelect/SearchingArea/gql.ts
index d642dac206..9671627b8f 100644
--- a/src/components/SearchSelect/SearchingArea/gql.ts
+++ b/src/components/SearchSelect/SearchingArea/gql.ts
@@ -75,8 +75,8 @@ export const LIST_VIEWER_ARTICLES = gql`
`
export const ARTICLE_URL_QUERY = gql`
- query ArticleUrlQuery($mediaHash: String!) {
- article(input: { mediaHash: $mediaHash }) {
+ query ArticleUrlQuery($id: ID!) {
+ node(input: { id: $id }) {
... on Article {
...ArticleDigestDropdownArticle
}
From 004905e511106dd9ab2fc68b0748a26661a1404b Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Tue, 4 Apr 2023 14:57:08 +0800
Subject: [PATCH 51/92] feat(EditMode): replace article.drafts with
newestPublishDraft
---
.../ArticleDetail/EditMode/Header/index.tsx | 5 ++
.../EditMode/PublishState/PendingState.tsx | 47 ++++++++++---------
.../EditMode/PublishState/PublishedState.tsx | 12 ++---
.../EditMode/PublishState/gql.ts | 8 ++--
.../EditMode/PublishState/index.tsx | 45 +++++++++---------
src/views/ArticleDetail/EditMode/gql.ts | 7 +++
src/views/ArticleDetail/EditMode/index.tsx | 17 ++++---
7 files changed, 76 insertions(+), 65 deletions(-)
diff --git a/src/views/ArticleDetail/EditMode/Header/index.tsx b/src/views/ArticleDetail/EditMode/Header/index.tsx
index eecf73b965..7955fbb865 100644
--- a/src/views/ArticleDetail/EditMode/Header/index.tsx
+++ b/src/views/ArticleDetail/EditMode/Header/index.tsx
@@ -23,6 +23,7 @@ type EditModeHeaderProps = {
isEditDisabled: boolean
onSaved: () => any
+ onPublish: () => any
} & Omit<
EditorSettingsDialogProps,
| 'saving'
@@ -45,6 +46,7 @@ const EditModeHeader = ({
isEditDisabled,
onSaved,
+ onPublish,
...restProps
}: EditModeHeaderProps) => {
@@ -75,6 +77,9 @@ const EditModeHeader = ({
canComment: restProps.canComment,
},
})
+ if (isContentRevised) {
+ onPublish()
+ }
if (!isContentRevised) {
onSaved()
diff --git a/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx b/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx
index ef1cb68484..32dc6a1f5d 100644
--- a/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx
+++ b/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx
@@ -2,39 +2,44 @@ import { useQuery } from '@apollo/react-hooks'
import { useEffect } from 'react'
import { Toast, Translate } from '~/components'
-import { EditModeArticleDraftsQuery, EditModeArticleQuery } from '~/gql/graphql'
+import { EditModeArticleNewestPublishDraftQuery } from '~/gql/graphql'
-import EDIT_MODE_ARTICLE_DRAFTS from './gql'
+import EDIT_MODE_ARTICLE_NEWEST_PUBLISH_DRAFT from './gql'
const PendingState = ({
- draft,
+ articleMediaHash,
+ updatePublishState,
id,
}: {
- draft: NonNullable<
- NonNullable<
- EditModeArticleQuery['article'] & { __typename: 'Article' }
- >['drafts']
- >[0]
+ articleMediaHash: string
+ updatePublishState: (mediaHash: string) => void
id: string
}) => {
- const { startPolling, stopPolling } = useQuery(
- EDIT_MODE_ARTICLE_DRAFTS,
- {
- variables: { id },
- errorPolicy: 'none',
- fetchPolicy: 'network-only',
- skip: typeof window === 'undefined',
- }
- )
+ const { data, startPolling, stopPolling, refetch } =
+ useQuery(
+ EDIT_MODE_ARTICLE_NEWEST_PUBLISH_DRAFT,
+ {
+ variables: { id },
+ errorPolicy: 'none',
+ fetchPolicy: 'network-only',
+ skip: typeof window === 'undefined',
+ }
+ )
useEffect(() => {
startPolling(1000 * 2)
-
- return () => {
- stopPolling()
- }
+ refetch && refetch()
}, [])
+ if (
+ data?.article?.__typename === 'Article' &&
+ data.article.newestPublishedDraft.publishState === 'published' &&
+ data.article.newestPublishedDraft.mediaHash !== articleMediaHash
+ ) {
+ stopPolling()
+ updatePublishState(data.article.newestPublishedDraft.mediaHash || '')
+ }
+
return (
['drafts']
- >[0]
+ newestMediaHash: string
cancel: () => void
}
@@ -35,12 +29,12 @@ const BasePublishedState = ({
return null
}
-const PublishedState = ({ article, draft, cancel }: Props) => {
+const PublishedState = ({ article, cancel, newestMediaHash }: Props) => {
const router = useRouter()
const path = toPath({
page: 'articleDetail',
- article: { ...article, mediaHash: draft.mediaHash },
+ article: { ...article, mediaHash: newestMediaHash },
})
return (
diff --git a/src/views/ArticleDetail/EditMode/PublishState/gql.ts b/src/views/ArticleDetail/EditMode/PublishState/gql.ts
index 1cf31df7d9..9c4578c047 100644
--- a/src/views/ArticleDetail/EditMode/PublishState/gql.ts
+++ b/src/views/ArticleDetail/EditMode/PublishState/gql.ts
@@ -2,8 +2,8 @@ import gql from 'graphql-tag'
import { fragments as EditorFragments } from '~/components/Editor/fragments'
-const EDIT_MODE_ARTICLE_DRAFTS = gql`
- query EditModeArticleDrafts($id: ID!) {
+const EDIT_MODE_ARTICLE_NEWEST_PUBLISH_DRAFT = gql`
+ query EditModeArticleNewestPublishDraft($id: ID!) {
article: node(input: { id: $id }) {
... on Article {
id
@@ -12,7 +12,7 @@ const EDIT_MODE_ARTICLE_DRAFTS = gql`
tags {
content
}
- drafts {
+ newestPublishedDraft {
id
mediaHash
tags
@@ -25,4 +25,4 @@ const EDIT_MODE_ARTICLE_DRAFTS = gql`
${EditorFragments.draft}
`
-export default EDIT_MODE_ARTICLE_DRAFTS
+export default EDIT_MODE_ARTICLE_NEWEST_PUBLISH_DRAFT
diff --git a/src/views/ArticleDetail/EditMode/PublishState/index.tsx b/src/views/ArticleDetail/EditMode/PublishState/index.tsx
index aeca35d7a3..5e234ac87c 100644
--- a/src/views/ArticleDetail/EditMode/PublishState/index.tsx
+++ b/src/views/ArticleDetail/EditMode/PublishState/index.tsx
@@ -1,4 +1,4 @@
-import { EditModeArticleQuery } from '~/gql/graphql'
+import { useState } from 'react'
import PendingState from './PendingState'
import PublishedState from './PublishedState'
@@ -14,28 +14,14 @@ interface Props {
userName?: string | null
}
}
- draft: NonNullable<
- NonNullable<
- EditModeArticleQuery['article'] & { __typename: 'Article' }
- >['drafts']
- >[0]
-
- isSameHash: boolean
-
cancel: () => void
}
-const PublishState = ({
- article,
- draft,
-
- isSameHash,
-
- cancel,
-}: Props) => {
- const isPending = draft.publishState === 'pending'
- const isPublished = draft.publishState === 'published'
- const isValidHash = typeof draft.mediaHash === 'string' && !!draft.mediaHash
+const PublishState = ({ article, cancel }: Props) => {
+ const [publishState, setPublishState] = useState('pending')
+ const isPending = publishState === 'pending'
+ const isPublished = publishState === 'published'
+ const [mediaHash, setMediaHash] = useState('')
if (!isPending && !isPublished) {
return null
@@ -43,11 +29,22 @@ const PublishState = ({
return (
- {(isPending || isPublished) && !isValidHash && (
-
+ {isPending && (
+ {
+ setPublishState('published')
+ setMediaHash(media)
+ }}
+ />
)}
- {isPublished && !isSameHash && isValidHash && (
-
+ {isPublished && (
+
)}
diff --git a/src/views/ArticleDetail/EditMode/gql.ts b/src/views/ArticleDetail/EditMode/gql.ts
index ce4ab8f7aa..5355f21dac 100644
--- a/src/views/ArticleDetail/EditMode/gql.ts
+++ b/src/views/ArticleDetail/EditMode/gql.ts
@@ -48,6 +48,13 @@ export const EDIT_MODE_ARTICLE = gql`
publishState
...EditorDraft
}
+ newestPublishedDraft {
+ id
+ mediaHash
+ tags
+ publishState
+ ...EditorDraft
+ }
...ArticleCollection
}
}
diff --git a/src/views/ArticleDetail/EditMode/index.tsx b/src/views/ArticleDetail/EditMode/index.tsx
index 47c242a81c..36a1216f6a 100644
--- a/src/views/ArticleDetail/EditMode/index.tsx
+++ b/src/views/ArticleDetail/EditMode/index.tsx
@@ -80,6 +80,7 @@ const Editor = dynamic(() => import('~/components/Editor/Article'), {
const EditMode: React.FC = ({ article, onCancel, onSaved }) => {
const [editData, setEditData] = useState>({})
+ const [showPublishState, setShowPublishState] = useState(false)
const { data, loading, error } = useQuery(
EDIT_MODE_ARTICLE,
{
@@ -303,17 +304,19 @@ const EditMode: React.FC = ({ article, onCancel, onSaved }) => {
isOverRevisionLimit={isOverRevisionLimit}
isSameHash={isSameHash}
isEditDisabled={isEditDisabled}
- onSaved={onSaved}
+ onSaved={() => {
+ onSaved()
+ }}
+ onPublish={() => {
+ setShowPublishState(true)
+ }}
/>
}
/>
-
+ {showPublishState && (
+
+ )}
Date: Tue, 4 Apr 2023 19:05:49 +0800
Subject: [PATCH 52/92] feat(EditMode): stopPolling when useEffect cleanup
---
.../ArticleDetail/EditMode/PublishState/PendingState.tsx | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx b/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx
index 32dc6a1f5d..623d7c011d 100644
--- a/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx
+++ b/src/views/ArticleDetail/EditMode/PublishState/PendingState.tsx
@@ -28,7 +28,12 @@ const PendingState = ({
useEffect(() => {
startPolling(1000 * 2)
+
refetch && refetch()
+
+ return () => {
+ stopPolling()
+ }
}, [])
if (
From 47cfe8e6fbc8aba760093cf249c0f46234ba0a99 Mon Sep 17 00:00:00 2001
From: 49659410+tx0c
Date: Wed, 29 Mar 2023 01:30:40 +0000
Subject: [PATCH 53/92] feat(ga-event): add banner_exposure events to Analytics
resolves #3311
---
src/common/utils/analytics.ts | 12 ++++
.../Analytics/BannerExposureTracker/index.tsx | 59 +++++++++++++++++++
src/components/Analytics/index.tsx | 1 +
.../Home/Announcements/Carousel/index.tsx | 30 ++++++----
4 files changed, 90 insertions(+), 12 deletions(-)
create mode 100644 src/components/Analytics/BannerExposureTracker/index.tsx
diff --git a/src/common/utils/analytics.ts b/src/common/utils/analytics.ts
index 3c219fdd6c..d82a329de2 100644
--- a/src/common/utils/analytics.ts
+++ b/src/common/utils/analytics.ts
@@ -32,6 +32,7 @@ type EventArgs =
| ['view_add_credit_dialog', ViewDialogProp]
| ['view_donation_dialog', ViewDialogProp]
| ['view_subscribe_circle_dialog', ViewDialogProp]
+ | ['banner_exposure', BannerExposureProp]
| ['card_exposure', CardExposureProp]
| ['tag_exposure', TagExposureProp]
@@ -146,6 +147,17 @@ interface ClickFeedProp {
* Event: Card Exposure
*/
+interface BannerExposureProp {
+ id: string
+ // feedType: FeedType
+ // contentType: ContentType | ActivityType
+ location: number | string
+ title: string
+ link: string
+ lang: Language
+ delay_msecs?: number
+}
+
interface CardExposureProp {
id: string
feedType: FeedType
diff --git a/src/components/Analytics/BannerExposureTracker/index.tsx b/src/components/Analytics/BannerExposureTracker/index.tsx
new file mode 100644
index 0000000000..7376521bc7
--- /dev/null
+++ b/src/components/Analytics/BannerExposureTracker/index.tsx
@@ -0,0 +1,59 @@
+import { useEffect, useState } from 'react'
+import { Waypoint } from 'react-waypoint'
+
+import { analytics } from '~/common/utils'
+
+export const BannerExposureTracker = ({
+ id,
+ location,
+ // feedType,
+ // contentType,
+ title,
+ link,
+ lang,
+ horizontal = false,
+}: {
+ id: string
+ location: number | string
+ // feedType: FeedType
+ // contentType: ContentType | ActivityType
+ title: string
+ link: string
+ lang: Language
+ horizontal?: boolean
+}) => {
+ const [timerId, setTimerId] = useState()
+ const [recorded, setRecorded] = useState(false)
+
+ // clean up when unmount
+ useEffect(() => () => window.clearTimeout(timerId), [timerId])
+
+ return (
+ {
+ // start timing 500ms after scroll into view
+ // only start timer if it has not been setup
+ if (!recorded) {
+ const timer = window.setTimeout(() => {
+ // analytics
+ analytics.trackEvent('banner_exposure', {
+ // feedType,
+ // contentType,
+ id,
+ location,
+ title,
+ link,
+ lang,
+ delay_msecs: window?.performance.now() ?? -1,
+ })
+ setRecorded(true)
+ }, 500)
+ setTimerId(timer)
+ }
+ }}
+ // cancel timer on leave
+ onLeave={() => window.clearTimeout(timerId)}
+ horizontal={horizontal}
+ />
+ )
+}
diff --git a/src/components/Analytics/index.tsx b/src/components/Analytics/index.tsx
index d9691283c7..145b3e9ee5 100644
--- a/src/components/Analytics/index.tsx
+++ b/src/components/Analytics/index.tsx
@@ -1,4 +1,5 @@
export * from './AnalyticsInitilizer'
+export * from './BannerExposureTracker'
export * from './CardExposureTracker'
export * from './PageViewTracker'
export * from './TagExposureTracker'
diff --git a/src/views/Home/Announcements/Carousel/index.tsx b/src/views/Home/Announcements/Carousel/index.tsx
index 05fe723694..7a20e45a69 100644
--- a/src/views/Home/Announcements/Carousel/index.tsx
+++ b/src/views/Home/Announcements/Carousel/index.tsx
@@ -3,6 +3,7 @@ import { useCallback, useContext, useEffect, useRef, useState } from 'react'
import { translate } from '~/common/utils'
import {
+ BannerExposureTracker,
Button,
Card,
IconClose32,
@@ -138,7 +139,7 @@ const Carousel = ({
onClickCapture={onCaptureClick}
>
- {items?.map((item) => {
+ {items?.map((item, i) => {
if (!item.cover) {
return null
}
@@ -146,26 +147,31 @@ const Carousel = ({
const translatedItem = item.translations?.find(
(translated) => translated.language === lang
)
- const hasTranslaton = translatedItem != null
+
+ // const hasTranslaton = translatedItem != null
+ const title = (translatedItem?.title ?? item.title) || ''
+ const itemLink = (translatedItem?.link ?? item.link) || ''
+ const itemContent = translatedItem?.content ?? item.content
return (
-
+
-
{hasTranslaton ? translatedItem.title : item.title}
-
- {hasTranslaton ? translatedItem.content : item.content}
-
+
{title}
+
{itemContent}
+
)
From f8e6c3177c4e3cd5b76bef32d765dcb337f2101b Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Fri, 7 Apr 2023 10:01:10 +0700
Subject: [PATCH 54/92] fix: fix import
---
.../SearchSelect/SearchingArea/EditorSearchingArea.tsx | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
index bde07e6a14..185ca106fb 100644
--- a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
+++ b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
@@ -7,7 +7,7 @@ import {
analytics,
isUrl,
mergeConnections,
- normalizeTagInput,
+ normalizeTag,
parseURL,
toGlobalId,
} from '~/common/utils'
@@ -102,7 +102,7 @@ const EditorSearchingArea: React.FC
= ({
const [searchKey, setSearchKey] = useState('')
const [debouncedSearchKey, setdebouncedSearchKey] = useState('')
const debouncedSetSearchKey = useDebouncedCallback((sk0) => {
- const sk = isTag ? normalizeTagInput(sk0) : sk0
+ const sk = isTag ? normalizeTag(sk0) : sk0
setdebouncedSearchKey(sk)
setSearchKey(sk)
}, INPUT_DEBOUNCE)
@@ -291,9 +291,7 @@ const EditorSearchingArea: React.FC = ({
{canCreateTag && (
From fe5b56969a7d738b4c00e53cced02a6c08c4ef9d Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 7 Apr 2023 11:10:04 +0800
Subject: [PATCH 55/92] feat(SearchSelect): revise regex
---
.../SearchSelect/SearchingArea/EditorSearchingArea.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
index 185ca106fb..01179edb6f 100644
--- a/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
+++ b/src/components/SearchSelect/SearchingArea/EditorSearchingArea.tsx
@@ -173,7 +173,7 @@ const EditorSearchingArea: React.FC = ({
// Used to match links of the format like👇
// https://matters.news/@az/12-来自matters的第一封信-致好朋友-zdpuAnuMKxNv6SUj7kTRzgrWRdp9q4aMMKHJ6TGtn8tp4FwX2
const regex = new RegExp(
- `^https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/@\\w+/\\d+-.+-\\w+$`
+ `^https://${process.env.NEXT_PUBLIC_SITE_DOMAIN}/@\\w+/\\d+.?$`
)
if (searchType === 'Article' && isUrl(key) && regex.test(key)) {
const urlObj = parseURL(key)
From 68e784b8bc1b40fa0a171c17fac20f7e4f2f23b2 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Wed, 15 Mar 2023 14:57:56 +0700
Subject: [PATCH 56/92] fix(form): remove tabIndex=-1 from
---
src/components/Forms/EmailLoginForm/Buttons.tsx | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/components/Forms/EmailLoginForm/Buttons.tsx b/src/components/Forms/EmailLoginForm/Buttons.tsx
index 76f704dd78..99d95cc935 100644
--- a/src/components/Forms/EmailLoginForm/Buttons.tsx
+++ b/src/components/Forms/EmailLoginForm/Buttons.tsx
@@ -13,10 +13,8 @@ export const PasswordResetDialogButton = ({
spacing={['xtight', 0]}
aria-haspopup="dialog"
onClick={gotoResetPassword}
- tabIndex={-1}
>
- {' '}
Date: Wed, 15 Mar 2023 15:31:37 +0700
Subject: [PATCH 57/92] Revert "fix(form): remove tabIndex=-1 from
"
---
src/components/Forms/EmailLoginForm/Buttons.tsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/components/Forms/EmailLoginForm/Buttons.tsx b/src/components/Forms/EmailLoginForm/Buttons.tsx
index 99d95cc935..76f704dd78 100644
--- a/src/components/Forms/EmailLoginForm/Buttons.tsx
+++ b/src/components/Forms/EmailLoginForm/Buttons.tsx
@@ -13,8 +13,10 @@ export const PasswordResetDialogButton = ({
spacing={['xtight', 0]}
aria-haspopup="dialog"
onClick={gotoResetPassword}
+ tabIndex={-1}
>
+ {' '}
Date: Wed, 29 Mar 2023 15:44:47 +0800
Subject: [PATCH 58/92] fix(Support): Fix support font size
---
src/views/ArticleDetail/SupportWidget/Donators/index.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/views/ArticleDetail/SupportWidget/Donators/index.tsx b/src/views/ArticleDetail/SupportWidget/Donators/index.tsx
index f71ae996a6..58b4c7f6e4 100644
--- a/src/views/ArticleDetail/SupportWidget/Donators/index.tsx
+++ b/src/views/ArticleDetail/SupportWidget/Donators/index.tsx
@@ -126,6 +126,7 @@ const Donators = ({ article, showAvatarAnimation = false }: DonatorsProps) => {
}
textPlacement="left"
+ size="xs"
>
Date: Wed, 29 Mar 2023 17:25:40 +0800
Subject: [PATCH 59/92] fix(Expandable): remove unused hover style code
---
src/components/Comment/Content/index.tsx | 3 ---
src/components/Expandable/index.tsx | 3 ---
src/components/Expandable/styles.css | 8 --------
src/components/Hook/index.ts | 1 -
src/components/Hook/useHover.tsx | 23 -----------------------
src/components/Notice/NoticeComment.tsx | 7 ++-----
6 files changed, 2 insertions(+), 43 deletions(-)
delete mode 100644 src/components/Hook/useHover.tsx
diff --git a/src/components/Comment/Content/index.tsx b/src/components/Comment/Content/index.tsx
index 6323bd2b8a..929eea7985 100644
--- a/src/components/Comment/Content/index.tsx
+++ b/src/components/Comment/Content/index.tsx
@@ -18,7 +18,6 @@ interface ContentProps {
type: CommentFormType
size?: 'sm' | 'md-s'
bgColor?: 'grey-lighter' | 'white'
- bgActiveColor?: 'grey-lighter' | 'white'
limit?: number
textIndent?: boolean
isRichShow?: boolean
@@ -50,7 +49,6 @@ const Content = ({
type,
size,
bgColor,
- bgActiveColor,
limit = 8,
textIndent = false,
isRichShow = true,
@@ -90,7 +88,6 @@ const Content = ({
limit={limit}
isRichShow={isRichShow}
bgColor={bgColor}
- bgActiveColor={bgActiveColor}
textIndent={textIndent}
>
= ({
@@ -47,7 +46,6 @@ export const Expandable: React.FC = ({
textIndent = false,
isRichShow = false,
bgColor = 'white',
- bgActiveColor,
}) => {
const [expandable, setExpandable] = useState(false)
const [lineHeight, setLineHeight] = useState(24)
@@ -69,7 +67,6 @@ export const Expandable: React.FC = ({
const richWrapperClasses = classNames({
richWrapper: true,
[`${bgColor}`]: !!bgColor,
- [`${bgActiveColor}-active`]: !!bgActiveColor,
})
useEffect(() => {
diff --git a/src/components/Expandable/styles.css b/src/components/Expandable/styles.css
index 04704c5e9c..7f78f4bf2b 100644
--- a/src/components/Expandable/styles.css
+++ b/src/components/Expandable/styles.css
@@ -42,14 +42,6 @@
var(--color-grey-lighter) 100%
);
}
-
- &.grey-lighter-active::after {
- background: linear-gradient(
- 180deg,
- rgb(247 247 247 / 0%) 0%,
- var(--color-grey-lighter-active) 100%
- );
- }
}
}
diff --git a/src/components/Hook/index.ts b/src/components/Hook/index.ts
index e5e7858f20..e41c1feaf6 100644
--- a/src/components/Hook/index.ts
+++ b/src/components/Hook/index.ts
@@ -6,7 +6,6 @@ export * from './useDialogSwitch'
export * from './useERC20'
export * from './useEventListener'
export * from './useFeatures'
-export * from './useHover'
export * from './useImmersiveMode'
export * from './useInterval'
export * from './useNativeEventListener'
diff --git a/src/components/Hook/useHover.tsx b/src/components/Hook/useHover.tsx
deleted file mode 100644
index 17fcdd8475..0000000000
--- a/src/components/Hook/useHover.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { MutableRefObject, useEffect, useRef, useState } from 'react'
-
-export const useHover = (): [MutableRefObject, boolean] => {
- const [value, setValue] = useState(false)
- const ref: any = useRef(null)
- const handleMouseOver = (): void => setValue(true)
- const handleMouseOut = (): void => setValue(false)
- useEffect(
- () => {
- const node: any = ref.current
- if (node) {
- node.addEventListener('mouseover', handleMouseOver)
- node.addEventListener('mouseout', handleMouseOut)
- return () => {
- node.removeEventListener('mouseover', handleMouseOver)
- node.removeEventListener('mouseout', handleMouseOut)
- }
- }
- },
- [ref.current] // Recall only if ref changes
- )
- return [ref, value]
-}
diff --git a/src/components/Notice/NoticeComment.tsx b/src/components/Notice/NoticeComment.tsx
index 5dcc2196b5..3a07263049 100644
--- a/src/components/Notice/NoticeComment.tsx
+++ b/src/components/Notice/NoticeComment.tsx
@@ -2,7 +2,7 @@ import gql from 'graphql-tag'
import { TEST_ID } from '~/common/enums'
import { toPath } from '~/common/utils'
-import { Card, useHover } from '~/components'
+import { Card } from '~/components'
import CommentContent from '~/components/Comment/Content'
import { NoticeCommentFragment } from '~/gql/graphql'
@@ -51,8 +51,6 @@ const NoticeComment = ({
const circle =
comment?.node.__typename === 'Circle' ? comment.node : undefined
- const [hoverRef, isHovered] = useHover()
-
if (!comment) {
return null
}
@@ -68,7 +66,7 @@ const NoticeComment = ({
: {}
return (
-
+
From 2b30fb5097114384926a5d66caf257c2a5fbc211 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 30 Mar 2023 11:09:02 +0800
Subject: [PATCH 60/92] feat(Notice): Remove payout notice codes
---
.../TransactionNotice/PaymentPayoutNotice.tsx | 64 -------------------
.../Notice/TransactionNotice/index.tsx | 5 --
2 files changed, 69 deletions(-)
delete mode 100644 src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx
diff --git a/src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx b/src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx
deleted file mode 100644
index 92a943f625..0000000000
--- a/src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import gql from 'graphql-tag'
-import { FormattedMessage } from 'react-intl'
-
-import { TEST_ID } from '~/common/enums'
-import { PaymentPayoutNoticeFragment } from '~/gql/graphql'
-
-import NoticeDate from '../NoticeDate'
-import NoticeTypeIcon from '../NoticeTypeIcon'
-import styles from '../styles.css'
-
-const PaymentPayoutNotice = ({
- notice,
-}: {
- notice: PaymentPayoutNoticeFragment
-}) => {
- const tx = notice.tx
-
- return (
-
-
-
-
-
-
- {tx && (
-
- {tx.amount} {tx.currency}
-
- )}
-
-
-
-
-
-
-
-
- )
-}
-
-PaymentPayoutNotice.fragments = {
- notice: gql`
- fragment PaymentPayoutNotice on TransactionNotice {
- id
- ...NoticeDate
- tx: target {
- id
- amount
- currency
- }
- }
- ${NoticeDate.fragments.notice}
- `,
-}
-
-export default PaymentPayoutNotice
diff --git a/src/components/Notice/TransactionNotice/index.tsx b/src/components/Notice/TransactionNotice/index.tsx
index 435ac2fb03..5c7f189862 100644
--- a/src/components/Notice/TransactionNotice/index.tsx
+++ b/src/components/Notice/TransactionNotice/index.tsx
@@ -2,7 +2,6 @@ import gql from 'graphql-tag'
import { TransactionNoticeFragment } from '~/gql/graphql'
-import PaymentPayoutNotice from './PaymentPayoutNotice'
import PaymentReceivedDonationNotice from './PaymentReceivedDonationNotice'
const TransactionNotice = ({
@@ -11,8 +10,6 @@ const TransactionNotice = ({
notice: TransactionNoticeFragment
}) => {
switch (notice.txNoticeType) {
- case 'PaymentPayout':
- return
case 'PaymentReceivedDonation':
return
default:
@@ -27,10 +24,8 @@ TransactionNotice.fragments = {
unread
__typename
txNoticeType: type
- ...PaymentPayoutNotice
...PaymentReceivedDonationNotice
}
- ${PaymentPayoutNotice.fragments.notice}
${PaymentReceivedDonationNotice.fragments.notice}
`,
}
From fe16d5c68e5230613c679e276d6549dff6fd3bc6 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 30 Mar 2023 15:40:51 +0800
Subject: [PATCH 61/92] fix(lang): format
---
lang/default.json | 8 --------
1 file changed, 8 deletions(-)
diff --git a/lang/default.json b/lang/default.json
index 7d6ff9a47c..f22804c21a 100644
--- a/lang/default.json
+++ b/lang/default.json
@@ -771,10 +771,6 @@
"defaultMessage": "Unblock",
"description": "src/components/BlockUser/Button/index.tsx"
},
- "bVZDVx": {
- "defaultMessage": "withdrawal process has started. Please refer to your bank for payout status.",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
- },
"beLe/F": {
"defaultMessage": "Broadcast",
"description": ""
@@ -1242,10 +1238,6 @@
"defaultMessage": "discussion and mentioned you",
"description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "z4NaU2": {
- "defaultMessage": "Your",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
- },
"zKOr2x": {
"defaultMessage": "Conversion Rate of Followers",
"description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
From bb892f4a42df55019a5b85fb5d1622f4c7697f99 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 30 Mar 2023 15:48:48 +0800
Subject: [PATCH 62/92] feat(Expandable): revise rich text expand ui
---
src/common/enums/text.ts | 2 +-
src/components/Comment/Content/index.tsx | 2 +-
src/components/Comment/Feed/index.tsx | 10 +++++--
src/components/Expandable/index.tsx | 35 +++++++++++-----------
src/components/Expandable/styles.css | 37 +++++++++++++++++++++++-
5 files changed, 64 insertions(+), 22 deletions(-)
diff --git a/src/common/enums/text.ts b/src/common/enums/text.ts
index aee6645625..1c365f6c50 100644
--- a/src/common/enums/text.ts
+++ b/src/common/enums/text.ts
@@ -955,7 +955,7 @@ export const TEXT = {
enterUserNameAgain: 'Enter Matters ID again',
enterVerificationCode: 'Enter verification code',
ENTITY_NOT_FOUND: 'Entity not found',
- expand: 'Expand',
+ expand: 'More',
extend: 'Collect',
collectArticle: 'Collect Article',
failureChange: 'Failed to edit, please try again.',
diff --git a/src/components/Comment/Content/index.tsx b/src/components/Comment/Content/index.tsx
index 929eea7985..1540e24bb8 100644
--- a/src/components/Comment/Content/index.tsx
+++ b/src/components/Comment/Content/index.tsx
@@ -49,7 +49,7 @@ const Content = ({
type,
size,
bgColor,
- limit = 8,
+ limit = 10,
textIndent = false,
isRichShow = true,
}: ContentProps) => {
diff --git a/src/components/Comment/Feed/index.tsx b/src/components/Comment/Feed/index.tsx
index dfaee93f62..787620c96f 100644
--- a/src/components/Comment/Feed/index.tsx
+++ b/src/components/Comment/Feed/index.tsx
@@ -2,7 +2,7 @@ import { useLazyQuery } from '@apollo/react-hooks'
import React from 'react'
import { TEST_ID } from '@/src/common/enums'
-import { AvatarSize, CommentFormType, UserDigest } from '~/components'
+import { AvatarSize, CommentFormType, Media, UserDigest } from '~/components'
import {
FeedCommentPrivateFragment,
FeedCommentPublicFragment,
@@ -87,7 +87,13 @@ export const BaseCommentFeed = ({
)}
-
+
+
+
+
+
+
+
= ({
[`${bgColor}`]: !!bgColor,
})
+ const richShowMoreButtonClasses = classNames({
+ richShowMoreButton: true,
+ [`${bgColor}`]: !!bgColor,
+ })
+
useEffect(() => {
setExpandable(false)
setExpand(true)
@@ -98,7 +103,7 @@ export const Expandable: React.FC = ({
{(!expandable || (expandable && expand)) &&
{children}
}
- {expandable && expand && (
+ {expandable && expand && !isRichShow && (
= ({
setExpand(!expand)
}}
>
- }>
+ } textPlacement="left">
)}
{expandable && !expand && (
-
+
{!isRichShow && (
= ({
>
{children}
-
- {
- setExpand(!expand)
- }}
- >
- }>
-
-
-
-
+ {
+ setExpand(!expand)
+ }}
+ >
+ }>
+
+
+
>
)}
diff --git a/src/components/Expandable/styles.css b/src/components/Expandable/styles.css
index 7f78f4bf2b..8b584c77a8 100644
--- a/src/components/Expandable/styles.css
+++ b/src/components/Expandable/styles.css
@@ -13,6 +13,41 @@
margin-top: var(--spacing-x-tight);
}
+ & .unexpandWrapper {
+ position: relative;
+
+ & .richShowMoreButton {
+ @mixin flex-start-center;
+
+ position: absolute;
+ bottom: 0;
+ align-items: flex-end;
+ width: 100%;
+ height: 7.5rem;
+ color: var(--color-grey);
+
+ &:hover {
+ color: var(--color-grey-darker);
+ }
+
+ &.white {
+ background: linear-gradient(
+ 180deg,
+ rgb(255 255 255 / 0%) 0%,
+ var(--color-white) 100%
+ );
+ }
+
+ &.grey-lighter {
+ background: linear-gradient(
+ 180deg,
+ rgb(247 247 247 / 0%) 0%,
+ var(--color-grey-lighter) 100%
+ );
+ }
+ }
+ }
+
& .richWrapper {
overflow-y: hidden;
overflow-y: clip;
@@ -20,7 +55,7 @@
&::after {
position: absolute;
right: 0;
- bottom: 2rem;
+ bottom: 0;
left: 0;
height: 80%;
pointer-events: none;
From 22e4e9be28adf020faca834f8fe27c799d98991e Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Mon, 3 Apr 2023 16:04:03 +0800
Subject: [PATCH 63/92] feat(Comment): adjust default limit line
---
src/components/Comment/Feed/index.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/Comment/Feed/index.tsx b/src/components/Comment/Feed/index.tsx
index 787620c96f..e1696b4fca 100644
--- a/src/components/Comment/Feed/index.tsx
+++ b/src/components/Comment/Feed/index.tsx
@@ -88,10 +88,10 @@ export const BaseCommentFeed = ({
-
+
-
+
Date: Tue, 4 Apr 2023 16:06:11 +0800
Subject: [PATCH 64/92] feat(NoticeComment): Don't change the background color
when hover
---
src/components/Notice/NoticeComment.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/Notice/NoticeComment.tsx b/src/components/Notice/NoticeComment.tsx
index 3a07263049..c1f21f7381 100644
--- a/src/components/Notice/NoticeComment.tsx
+++ b/src/components/Notice/NoticeComment.tsx
@@ -70,6 +70,7 @@ const NoticeComment = ({
Date: Tue, 4 Apr 2023 16:07:32 +0800
Subject: [PATCH 65/92] feat(UserComments): Don't change the background color
when hover
---
src/views/User/Comments/UserComments.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/views/User/Comments/UserComments.tsx b/src/views/User/Comments/UserComments.tsx
index db2780549c..08979ad31f 100644
--- a/src/views/User/Comments/UserComments.tsx
+++ b/src/views/User/Comments/UserComments.tsx
@@ -212,6 +212,7 @@ const BaseUserComments = ({ user }: UserIdUserQuery) => {
Date: Mon, 10 Apr 2023 16:38:05 +0700
Subject: [PATCH 66/92] fix: fix cropped descender of letters;
---
src/components/Tag/styles.css | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/components/Tag/styles.css b/src/components/Tag/styles.css
index f54ec7fd1e..1dddf0338a 100644
--- a/src/components/Tag/styles.css
+++ b/src/components/Tag/styles.css
@@ -5,6 +5,9 @@
.tag .name {
@mixin line-clamp;
+ /* FIXME: fix cropped descenders of letters */
+ padding-bottom: 0.14em;
+ margin-bottom: -0.14rem;
line-height: inherit;
}
From 3ae081d4d906fa230cbd722dea82997bfe1ee69d Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Mon, 10 Apr 2023 18:51:43 +0700
Subject: [PATCH 67/92] fix: submit form on pin input complete
---
src/common/utils/validator.ts | 4 +++-
src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx | 3 +--
src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx | 2 --
src/components/Forms/PaymentForm/SetPassword/index.tsx | 2 --
.../Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx | 3 +--
5 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/src/common/utils/validator.ts b/src/common/utils/validator.ts
index 65f2328218..ba912658f6 100644
--- a/src/common/utils/validator.ts
+++ b/src/common/utils/validator.ts
@@ -1,5 +1,7 @@
import isEmail from 'validator/lib/isEmail'
+import { PAYMENT_PASSSWORD_LENGTH } from '../enums'
+
/**
* Validate email address.
*/
@@ -37,7 +39,7 @@ export const isValidPassword = (password: string): boolean => {
* Validate payment pass word. It only accepts digital.
*/
export const isValidPaymentPassword = (password: string): boolean => {
- if (!password || password.length !== 6) {
+ if (!password || password.length !== PAYMENT_PASSSWORD_LENGTH) {
return false
}
diff --git a/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx b/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
index 4235381e1c..694b180af3 100644
--- a/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
+++ b/src/components/Forms/PaymentForm/PayTo/Confirm/index.tsx
@@ -101,7 +101,6 @@ const Confirm: React.FC = ({
const {
errors,
handleSubmit,
- isValid,
isSubmitting,
setFieldValue,
setTouched,
@@ -171,7 +170,7 @@ const Confirm: React.FC = ({
)
useEffect(() => {
- if (isValid && values.password.length === PAYMENT_PASSSWORD_LENGTH) {
+ if (values.password.length === PAYMENT_PASSSWORD_LENGTH) {
handleSubmit()
}
}, [values.password])
diff --git a/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx b/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
index 460ae2ecb9..4b00e682e5 100644
--- a/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
+++ b/src/components/Forms/PaymentForm/ResetPassword/Confirm.tsx
@@ -57,7 +57,6 @@ const Confirm: React.FC = ({ codeId, submitCallback }) => {
setTouched,
handleSubmit,
isSubmitting,
- isValid,
} = useFormik({
initialValues: {
password: '',
@@ -141,7 +140,6 @@ const Confirm: React.FC = ({ codeId, submitCallback }) => {
useEffect(() => {
// submit on validate
if (
- isValid &&
values.password.length === PAYMENT_PASSSWORD_LENGTH &&
values.comparedPassword.length === PAYMENT_PASSSWORD_LENGTH
) {
diff --git a/src/components/Forms/PaymentForm/SetPassword/index.tsx b/src/components/Forms/PaymentForm/SetPassword/index.tsx
index c66d5c2c84..10be54fada 100644
--- a/src/components/Forms/PaymentForm/SetPassword/index.tsx
+++ b/src/components/Forms/PaymentForm/SetPassword/index.tsx
@@ -61,7 +61,6 @@ const PaymentSetPasswordForm: React.FC = ({ submitCallback }) => {
isSubmitting,
handleSubmit,
setFieldValue,
- isValid,
touched,
setTouched,
} = useFormik({
@@ -145,7 +144,6 @@ const PaymentSetPasswordForm: React.FC = ({ submitCallback }) => {
useEffect(() => {
// submit on validate
if (
- isValid &&
values.password.length === PAYMENT_PASSSWORD_LENGTH &&
values.comparedPassword.length === PAYMENT_PASSSWORD_LENGTH
) {
diff --git a/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx b/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
index 6ca95a72a2..8dce25b9d9 100644
--- a/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
+++ b/src/components/Forms/PaymentForm/SubscribeCircle/PasswordPayment.tsx
@@ -57,7 +57,6 @@ const Confirm: React.FC = ({
const {
errors,
handleSubmit,
- isValid,
isSubmitting,
setFieldValue,
setTouched,
@@ -107,7 +106,7 @@ const Confirm: React.FC = ({
)
useEffect(() => {
- if (isValid && values.password.length === PAYMENT_PASSSWORD_LENGTH) {
+ if (values.password.length === PAYMENT_PASSSWORD_LENGTH) {
handleSubmit()
}
}, [values.password])
From c600a8af1799946900a54352a8c8eae7953201e9 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 16 Mar 2023 16:16:32 +0800
Subject: [PATCH 68/92] feat(test): add mutateArticle test
---
tests/mutateArticle.spec.ts | 236 ++++++++++++++++++++++++++++++++++++
1 file changed, 236 insertions(+)
create mode 100644 tests/mutateArticle.spec.ts
diff --git a/tests/mutateArticle.spec.ts b/tests/mutateArticle.spec.ts
new file mode 100644
index 0000000000..f325f8d5ef
--- /dev/null
+++ b/tests/mutateArticle.spec.ts
@@ -0,0 +1,236 @@
+import { expect, test } from '@playwright/test'
+import _random from 'lodash/random'
+
+import { sleep } from '@/src/common/utils/time'
+import { TEST_ID } from '~/common/enums'
+import { stripSpaces } from '~/common/utils/text'
+
+import { publishDraft } from './common'
+import {
+ ArticleDetailPage,
+ authedTest,
+ DraftDetailPage,
+ NotificationsPage,
+ pageGoto,
+ UserProfilePage,
+ waitForAPIResponse,
+} from './helpers'
+
+test.describe.only('Mutate article', () => {
+ authedTest(
+ "Alice' article is appreciation by Bob, and received notification",
+ async ({ alicePage, bobPage, isMobile, request }) => {
+ // [Alice] create and publish new article
+ await publishDraft({ page: alicePage, isMobile })
+
+ // const mediaHashState = await request.post(
+ // 'https://server-develop.matters.news/graphql',
+ // {
+ // data: {
+ // variables: {},
+ // query:
+ // '{\n node(input: {id: "QXJ0aWNsZTo5MDI2"}) {\n ... on Article {\n id\n mediaHash\n }\n }\n}\n',
+ // },
+ // }
+ // )
+ // console.log({ mediaHashState })
+ // console.log(await mediaHashState.json())
+
+ // [Alice] Get new article link
+ const aliceArticleLink = alicePage.url()
+
+ // [Bob] Go to Alice's article page
+ await pageGoto(bobPage, aliceArticleLink)
+
+ const bobArticleDetail = new ArticleDetailPage(bobPage, isMobile)
+
+ while (true) {
+ const appreciationButtonState =
+ await bobArticleDetail.toolbarAppreciationButton.getAttribute(
+ 'disabled'
+ )
+ if (appreciationButtonState === null) break
+ await sleep(5 * 1000)
+ await bobPage.reload()
+ await bobPage.waitForLoadState('networkidle')
+ }
+
+ const title = await bobArticleDetail.getTitle()
+
+ const amount = _random(1, 5, false)
+
+ // [Bob] appreciation
+ await bobArticleDetail.sendAppreciation(amount)
+
+ // [Alice] Go to notifications page
+ const aliceNotifications = new NotificationsPage(alicePage)
+ await aliceNotifications.goto()
+
+ // [Alice] Expect it has "liked your article" notice
+ const noticeReceiveArtileTitle = await alicePage
+ .getByTestId(TEST_ID.ARTICLE_NEW_APPRECIATION)
+ .first()
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .first()
+ .innerText({
+ // FIXME: notifications page is slow to fetch data since it's no-cache
+ timeout: 15e3,
+ })
+ expect(stripSpaces(noticeReceiveArtileTitle)).toBe(stripSpaces(title))
+
+ // [Alice] Check Appreciation count
+ await alicePage
+ .getByTestId(TEST_ID.ARTICLE_NEW_APPRECIATION)
+ .first()
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .first()
+ .click()
+ const aliceAppreciationAmount = await alicePage
+ .getByTestId(TEST_ID.ARTICLE_APPRECIATION_TOTAL)
+ .innerText()
+ expect(aliceAppreciationAmount).toBe(amount.toString())
+ }
+ )
+
+ authedTest(
+ "Alice' article is bookmarked by Bob",
+ async ({ alicePage, bobPage, isMobile }) => {
+ // [Alice] Go to profile page
+ const aliceProfile = new UserProfilePage(alicePage, isMobile)
+ await aliceProfile.gotoMeProfile()
+
+ // [Alice] Get first article
+ const aliceArticleLink = (await aliceProfile.feedArticles
+ .first()
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .getAttribute('href')) as string
+ expect(aliceArticleLink).toBeTruthy()
+
+ // [Bob] Go to Alice's article page
+ await pageGoto(bobPage, aliceArticleLink)
+ const aliceArticleDetail = new ArticleDetailPage(bobPage, isMobile)
+
+ const firstLabel =
+ await aliceArticleDetail.toolbarBookmarkButton.getAttribute(
+ 'aria-label'
+ )
+ // [Bob] bookmark
+ await aliceArticleDetail.sendBookmark()
+ const secondLabel =
+ await aliceArticleDetail.toolbarBookmarkButton.getAttribute(
+ 'aria-label'
+ )
+
+ expect(firstLabel !== secondLabel).toBeTruthy()
+ }
+ )
+
+ authedTest(
+ "Alice' article is forked by Bob",
+ async ({ alicePage, bobPage, isMobile }) => {
+ // [Alice] Go to profile page
+ const aliceProfile = new UserProfilePage(alicePage, isMobile)
+ await aliceProfile.gotoMeProfile()
+
+ // [Alice] Get first article
+ const aliceArticleLink = (await aliceProfile.feedArticles
+ .first()
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .getAttribute('href')) as string
+ expect(aliceArticleLink).toBeTruthy()
+
+ // [Bob] Go to Alice's article page
+ await pageGoto(bobPage, aliceArticleLink)
+ const aliceArticleDetail = new ArticleDetailPage(bobPage, isMobile)
+ const aliceTitle = await aliceArticleDetail.getTitle()
+
+ await aliceArticleDetail.forkArticle()
+
+ // [Bob] create and publish article
+ const draftDetail = new DraftDetailPage(bobPage, isMobile)
+ // Required: Fill title and content
+ const title = await draftDetail.fillTitle()
+ const content = await draftDetail.fillContent()
+ await draftDetail.publish()
+
+ // Goto published article page
+ // Promise.all prevents a race condition between clicking and waiting.
+ await Promise.all([
+ bobPage.waitForNavigation(),
+ draftDetail.dialogViewArticleButton.click(),
+ ])
+
+ const bobArticleDetail = new ArticleDetailPage(bobPage, isMobile)
+ const bobTitle = await bobArticleDetail.getTitle()
+ expect(stripSpaces(bobTitle)).toBe(stripSpaces(title))
+
+ const bobContent = await bobArticleDetail.content.innerText()
+ expect(stripSpaces(bobContent)).toBe(stripSpaces(content))
+
+ const firstCollectionArticleTitle =
+ await bobArticleDetail.getFirstCollectionArticleTitle()
+ expect(stripSpaces(firstCollectionArticleTitle)).toBe(
+ stripSpaces(aliceTitle)
+ )
+ }
+ )
+
+ authedTest('Pin and unpin article', async ({ alicePage, isMobile }) => {
+ // [Alice] Go to profile page
+ const aliceProfile = new UserProfilePage(alicePage, isMobile)
+ await aliceProfile.gotoMeProfile()
+
+ // [Alice] Get first article
+ const aliceArticles = await aliceProfile.feedArticles.all()
+ const secondArticle = await aliceArticles[1].first()
+ await expect(secondArticle).toBeVisible()
+ const secondArticleTitle = await secondArticle
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .innerText()
+
+ await secondArticle.getByRole('button', { name: 'More Actions' }).click()
+ const pinButton = await alicePage
+ .getByRole('menuitem', { name: 'Article pinned' })
+ .locator('section')
+ await Promise.all([
+ waitForAPIResponse({
+ page: alicePage,
+ path: 'data.editArticle.sticky',
+ isOK: (data) => data === true,
+ }),
+ pinButton.click(),
+ ])
+
+ const firstArticle = await aliceProfile.feedArticles.first()
+ const firstArticleTitle = await firstArticle
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .innerText()
+ expect(stripSpaces(firstArticleTitle)).toBe(stripSpaces(secondArticleTitle))
+ const footerPin = firstArticle.getByTestId(
+ TEST_ID.DIGEST_ARTICLE_FEED_FOOTER_PIN
+ )
+ await expect(footerPin).toBeVisible()
+
+ // unpin
+ await firstArticle.getByRole('button', { name: 'More Actions' }).click()
+ const unpinButton = await alicePage
+ .getByRole('menuitem', { name: 'Unpin' })
+ .locator('section')
+ await Promise.all([
+ waitForAPIResponse({
+ page: alicePage,
+ path: 'data.editArticle.sticky',
+ isOK: (data) => data === false,
+ }),
+ unpinButton.click(),
+ ])
+ const firstArticleAfterUnpin = await aliceProfile.feedArticles.first()
+ const firstArticleTitleAfterUnpin = await firstArticleAfterUnpin
+ .getByTestId(TEST_ID.DIGEST_ARTICLE_TITLE)
+ .innerText()
+ expect(
+ stripSpaces(firstArticleTitle) !==
+ stripSpaces(firstArticleTitleAfterUnpin)
+ ).toBeTruthy()
+ })
+})
From 93ea26000172920f03e69b2fe6db365a7a54dcf6 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Fri, 17 Mar 2023 11:36:51 +0800
Subject: [PATCH 69/92] feat(test): add revise article test
---
tests/common/publishDraft.ts | 6 +++++
tests/helpers/poms/articleDetail.ts | 9 +++++++
tests/helpers/poms/draftDetail.ts | 24 ++++++++++++++++++
tests/mutateArticle.spec.ts | 38 +++++++++++++++++------------
4 files changed, 62 insertions(+), 15 deletions(-)
diff --git a/tests/common/publishDraft.ts b/tests/common/publishDraft.ts
index 8b94985be1..df94edc1b3 100644
--- a/tests/common/publishDraft.ts
+++ b/tests/common/publishDraft.ts
@@ -98,4 +98,10 @@ export const publishDraft = async ({
const articleLicense = await articleDetail.getLicense()
expect(stripSpaces(articleLicense)).toBe(stripSpaces(license))
}
+
+ return {
+ title,
+ summary,
+ content,
+ }
}
diff --git a/tests/helpers/poms/articleDetail.ts b/tests/helpers/poms/articleDetail.ts
index 033389979a..b456f95f02 100644
--- a/tests/helpers/poms/articleDetail.ts
+++ b/tests/helpers/poms/articleDetail.ts
@@ -41,6 +41,7 @@ export class ArticleDetailPage {
readonly toolbarViewSupportersButton: Locator
readonly toolbarIPFSButton: Locator
readonly toolbarCollectButton: Locator
+ readonly toolbarEditButton: Locator
// dialog
readonly dialog: Locator
@@ -99,6 +100,9 @@ export class ArticleDetailPage {
this.toolbarCollectButton = this.page.getByRole('menuitem', {
name: 'Collect Article',
})
+ this.toolbarEditButton = this.page.getByRole('menuitem', {
+ name: 'Edit',
+ })
// dialog
this.dialog = this.page.getByRole('dialog')
@@ -186,6 +190,11 @@ export class ArticleDetailPage {
await this.toolbarCollectButton.click()
}
+ async editArticle() {
+ await this.toolbarMoreButton.click()
+ await this.toolbarEditButton.click()
+ }
+
async supportHKD(password: string, amount: number) {
// Open support dialog
await this.supportButton.click()
diff --git a/tests/helpers/poms/draftDetail.ts b/tests/helpers/poms/draftDetail.ts
index 032aa1043a..6a7bc69251 100644
--- a/tests/helpers/poms/draftDetail.ts
+++ b/tests/helpers/poms/draftDetail.ts
@@ -49,6 +49,12 @@ export class DraftDetailPage {
readonly dialogSaveButton: Locator
readonly dialogDoneButton: Locator
+ // reediting
+ readonly dialogEditButton: Locator
+ readonly nextButton: Locator
+ readonly dialogSaveRevisions: Locator
+ readonly dialogViewRepublishedArticle: Locator
+
constructor(page: Page, isMobile?: boolean) {
this.page = page
this.isMobile = isMobile
@@ -105,6 +111,16 @@ export class DraftDetailPage {
this.dialogDoneButton = this.dialog.getByRole('button', {
name: 'Done',
})
+
+ // reediting
+ this.dialogEditButton = this.dialog.getByRole('button', { name: 'Edit' })
+ this.nextButton = this.page.getByRole('button', { name: 'Next' })
+ this.dialogSaveRevisions = this.dialog.getByRole('button', {
+ name: 'Save Revisions',
+ })
+ this.dialogViewRepublishedArticle = this.dialog.getByRole('button', {
+ name: 'View republished article',
+ })
}
async createDraft() {
@@ -324,4 +340,12 @@ export class DraftDetailPage {
await this.dialogPublishButton.click()
await expect(this.dialogViewArticleButton).toBeVisible()
}
+
+ async rePublish() {
+ await this.nextButton.click()
+ await this.dialogPublishButton.click()
+ await this.dialogPublishButton.click()
+ await this.page.waitForLoadState('networkidle')
+ await expect(this.dialogViewRepublishedArticle).toBeVisible()
+ }
}
diff --git a/tests/mutateArticle.spec.ts b/tests/mutateArticle.spec.ts
index f325f8d5ef..2e912dcecf 100644
--- a/tests/mutateArticle.spec.ts
+++ b/tests/mutateArticle.spec.ts
@@ -16,26 +16,13 @@ import {
waitForAPIResponse,
} from './helpers'
-test.describe.only('Mutate article', () => {
+test.describe('Mutate article', () => {
authedTest(
"Alice' article is appreciation by Bob, and received notification",
async ({ alicePage, bobPage, isMobile, request }) => {
// [Alice] create and publish new article
await publishDraft({ page: alicePage, isMobile })
- // const mediaHashState = await request.post(
- // 'https://server-develop.matters.news/graphql',
- // {
- // data: {
- // variables: {},
- // query:
- // '{\n node(input: {id: "QXJ0aWNsZTo5MDI2"}) {\n ... on Article {\n id\n mediaHash\n }\n }\n}\n',
- // },
- // }
- // )
- // console.log({ mediaHashState })
- // console.log(await mediaHashState.json())
-
// [Alice] Get new article link
const aliceArticleLink = alicePage.url()
@@ -190,7 +177,7 @@ test.describe.only('Mutate article', () => {
await secondArticle.getByRole('button', { name: 'More Actions' }).click()
const pinButton = await alicePage
- .getByRole('menuitem', { name: 'Article pinned' })
+ .getByRole('menuitem', { name: 'Pin article' })
.locator('section')
await Promise.all([
waitForAPIResponse({
@@ -233,4 +220,25 @@ test.describe.only('Mutate article', () => {
stripSpaces(firstArticleTitleAfterUnpin)
).toBeTruthy()
})
+
+ authedTest('revise article', async ({ alicePage, isMobile }) => {
+ // [Alice] create and publish new article
+ const article = await publishDraft({ page: alicePage, isMobile })
+
+ const aliceArticleDetail = new ArticleDetailPage(alicePage, isMobile)
+ // revise article
+ aliceArticleDetail.editArticle()
+
+ const draftDetail = new DraftDetailPage(alicePage, isMobile)
+ await draftDetail.dialogEditButton.click()
+ const newContent = 'revise article ' + article.content
+ await draftDetail.contentInput.fill(newContent)
+ await draftDetail.rePublish()
+
+ // Goto republished article page
+ await draftDetail.dialogViewRepublishedArticle.click()
+ await alicePage.waitForLoadState('networkidle')
+ const articleContent = await aliceArticleDetail.content.innerText()
+ expect(stripSpaces(articleContent)).toBe(stripSpaces(newContent))
+ })
})
From 979c30cd0c9ebb77e81c34a12f555a4db42b2434 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Tue, 4 Apr 2023 13:52:08 +0800
Subject: [PATCH 70/92] feat(test): update placeholder
---
tests/helpers/poms/draftDetail.ts | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tests/helpers/poms/draftDetail.ts b/tests/helpers/poms/draftDetail.ts
index 6a7bc69251..9e3863b3aa 100644
--- a/tests/helpers/poms/draftDetail.ts
+++ b/tests/helpers/poms/draftDetail.ts
@@ -242,7 +242,9 @@ export class DraftDetailPage {
// type and search
const searchKey = 'test'
- await this.page.getByPlaceholder('Search articles').fill(searchKey)
+ await this.page
+ .getByPlaceholder('Enter article title or paste article link')
+ .fill(searchKey)
await waitForAPIResponse({
page: this.page,
From 973604122efddc3c2c504d1c73f826d38888c945 Mon Sep 17 00:00:00 2001
From: bluecloud <96812901+pitb2022@users.noreply.github.com>
Date: Thu, 6 Apr 2023 21:10:11 +0800
Subject: [PATCH 71/92] fix(test): fix firefox timeout bug
---
tests/mutateArticle.spec.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tests/mutateArticle.spec.ts b/tests/mutateArticle.spec.ts
index 2e912dcecf..e14b7b09b3 100644
--- a/tests/mutateArticle.spec.ts
+++ b/tests/mutateArticle.spec.ts
@@ -227,10 +227,11 @@ test.describe('Mutate article', () => {
const aliceArticleDetail = new ArticleDetailPage(alicePage, isMobile)
// revise article
- aliceArticleDetail.editArticle()
+ await aliceArticleDetail.editArticle()
const draftDetail = new DraftDetailPage(alicePage, isMobile)
await draftDetail.dialogEditButton.click()
+ await sleep(3 * 1000)
const newContent = 'revise article ' + article.content
await draftDetail.contentInput.fill(newContent)
await draftDetail.rePublish()
From d30c4565d51bc26852ba1a0815ad30c0a1bc8657 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Tue, 11 Apr 2023 21:56:02 +0700
Subject: [PATCH 72/92] fix(i18n): fix translation on CommentPinnedNotice
---
lang/default.json | 11 ++++-------
lang/en.json | 4 ++++
lang/zh-Hans.json | 4 ++++
lang/zh-Hant.json | 4 ++++
.../Notice/CommentNotice/CommentPinnedNotice.tsx | 5 ++++-
5 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/lang/default.json b/lang/default.json
index 81973e34de..be0b4600d3 100644
--- a/lang/default.json
+++ b/lang/default.json
@@ -79,6 +79,10 @@
"defaultMessage": "Likes",
"description": ""
},
+ "2uRduT": {
+ "defaultMessage": "comment",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ },
"2uwwz+": {
"defaultMessage": "Accumulated read time indicates the total time length that registered users read.",
"description": "src/components/Dialogs/HelpDialog/index.tsx"
@@ -163,10 +167,6 @@
"defaultMessage": "Term of Services",
"description": ""
},
- "6gOpfl": {
- "defaultMessage": "You won't see announcements for 7 days",
- "description": "src/views/Home/Announcements/index.tsx"
- },
"77tYPg": {
"defaultMessage": "After deletion, the {commentType} will be removed immediately",
"description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
@@ -1007,9 +1007,6 @@
"defaultMessage": "Logged in successfully",
"description": ""
},
- "ntjlWR": {
- "defaultMessage": "comment"
- },
"o2Na0B": {
"defaultMessage": "Back to All",
"description": ""
diff --git a/lang/en.json b/lang/en.json
index f799a1dac1..8bcebe2173 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -607,6 +607,10 @@
"defaultMessage": "Likes",
"description": ""
},
+ "2uRduT": {
+ "defaultMessage": "",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ },
"MkwOFW": {
"defaultMessage": "Read History",
"description": ""
diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json
index bc9fb68360..360d711866 100644
--- a/lang/zh-Hans.json
+++ b/lang/zh-Hans.json
@@ -651,6 +651,10 @@
"defaultMessage": "我的赞赏",
"description": ""
},
+ "2uRduT": {
+ "defaultMessage": " 的评论",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ },
"MkwOFW": {
"defaultMessage": "浏览记录",
"description": ""
diff --git a/lang/zh-Hant.json b/lang/zh-Hant.json
index e45ba2ce67..2650ea5f7a 100644
--- a/lang/zh-Hant.json
+++ b/lang/zh-Hant.json
@@ -643,6 +643,10 @@
"defaultMessage": "我的讚賞",
"description": ""
},
+ "2uRduT": {
+ "defaultMessage": " 的評論",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ },
"MkwOFW": {
"defaultMessage": "瀏覽紀錄",
"description": ""
diff --git a/src/components/Notice/CommentNotice/CommentPinnedNotice.tsx b/src/components/Notice/CommentNotice/CommentPinnedNotice.tsx
index 44be73eac8..d13e47f0fd 100644
--- a/src/components/Notice/CommentNotice/CommentPinnedNotice.tsx
+++ b/src/components/Notice/CommentNotice/CommentPinnedNotice.tsx
@@ -41,7 +41,10 @@ const CommentPinnedNotice = ({
description="src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
/>
{commentArticle && }
-
+
From 9d1bc50648e64382203eb3a616ffabd375485027 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Tue, 11 Apr 2023 22:05:22 +0700
Subject: [PATCH 73/92] fix(style): fix comment labels
---
src/components/Comment/DonatorLabel/styles.css | 3 ++-
src/components/Comment/PinnedLabel/styles.css | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/components/Comment/DonatorLabel/styles.css b/src/components/Comment/DonatorLabel/styles.css
index 702fa43ff4..1e90527bed 100644
--- a/src/components/Comment/DonatorLabel/styles.css
+++ b/src/components/Comment/DonatorLabel/styles.css
@@ -1,5 +1,6 @@
.label {
- display: inline-block;
+ @mixin inline-flex-center-all;
+
padding: var(--spacing-xx-tight) var(--spacing-x-tight);
font-size: var(--font-size-xs);
line-height: 1;
diff --git a/src/components/Comment/PinnedLabel/styles.css b/src/components/Comment/PinnedLabel/styles.css
index f1f930e677..d648e0e7bb 100644
--- a/src/components/Comment/PinnedLabel/styles.css
+++ b/src/components/Comment/PinnedLabel/styles.css
@@ -1,5 +1,6 @@
.label {
- display: inline-block;
+ @mixin inline-flex-center-all;
+
padding: var(--spacing-xx-tight) var(--spacing-x-tight);
font-size: var(--font-size-xs);
line-height: 1;
From 1d9e401104cdd8b32d9269e0b1df3a0ca29e3942 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Tue, 11 Apr 2023 22:31:03 +0700
Subject: [PATCH 74/92] fix(style): fix subtexts vertical align
---
.stylelintrc.json | 1 +
src/common/styles/variables/typography.css | 4 ++--
src/components/CircleDigest/Plain/styles.css | 4 ++--
src/components/Tag/styles.css | 4 ++--
.../Analytics/ContentAnalytics/ContentDigest/styles.css | 2 +-
src/views/Follow/Feed/FollowingFeedHead/styles.css | 2 +-
6 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/.stylelintrc.json b/.stylelintrc.json
index 7eb20a01a1..c1e031e765 100644
--- a/.stylelintrc.json
+++ b/.stylelintrc.json
@@ -6,6 +6,7 @@
],
"plugins": ["stylelint-prettier"],
"rules": {
+ "number-max-precision": 7,
"at-rule-no-unknown": null,
"no-descending-specificity": null,
"prettier/prettier": true,
diff --git a/src/common/styles/variables/typography.css b/src/common/styles/variables/typography.css
index 8da19b2347..cb1bf964e4 100644
--- a/src/common/styles/variables/typography.css
+++ b/src/common/styles/variables/typography.css
@@ -44,12 +44,12 @@
/* Feed Title */
--font-size-feed-title: var(--font-size-xm);
- --line-height-feed-title: 1.3333; /* 24/18 */
+ --line-height-feed-title: 1.3333333; /* 24/18 */
--font-weight-feed-title: var(--font-weight-medium);
/* Subtext: digest footer, datetime, etc. */
--font-size-subtext: var(--font-size-xs);
- --line-height-subtext: 1.3333; /* 16/12 */
+ --line-height-subtext: 1.3333333; /* 16/12 */
--font-weight-subtext: var(--font-weight-normal);
/* Article Title */
diff --git a/src/components/CircleDigest/Plain/styles.css b/src/components/CircleDigest/Plain/styles.css
index d05a0fead6..2c2de38d52 100644
--- a/src/components/CircleDigest/Plain/styles.css
+++ b/src/components/CircleDigest/Plain/styles.css
@@ -8,6 +8,6 @@ section {
@mixin line-clamp;
/* FIXME: fix cropped descenders of letters */
- padding-bottom: 0.14em;
- margin-bottom: -0.14rem;
+ padding-bottom: 0.12em;
+ margin-bottom: -0.12rem;
}
diff --git a/src/components/Tag/styles.css b/src/components/Tag/styles.css
index 1dddf0338a..53d0f7e532 100644
--- a/src/components/Tag/styles.css
+++ b/src/components/Tag/styles.css
@@ -6,8 +6,8 @@
@mixin line-clamp;
/* FIXME: fix cropped descenders of letters */
- padding-bottom: 0.14em;
- margin-bottom: -0.14rem;
+ padding-bottom: 0.12em;
+ margin-bottom: -0.12rem;
line-height: inherit;
}
diff --git a/src/views/Circle/Analytics/ContentAnalytics/ContentDigest/styles.css b/src/views/Circle/Analytics/ContentAnalytics/ContentDigest/styles.css
index 4d5087a4f5..daa90b5f33 100644
--- a/src/views/Circle/Analytics/ContentAnalytics/ContentDigest/styles.css
+++ b/src/views/Circle/Analytics/ContentAnalytics/ContentDigest/styles.css
@@ -13,7 +13,7 @@
padding-right: var(--spacing-tight);
font-size: var(--font-size-xm);
font-weight: var(--font-weight-semibold);
- line-height: 1.3333;
+ line-height: 1.3333333;
color: var(--color-analytics-red);
}
diff --git a/src/views/Follow/Feed/FollowingFeedHead/styles.css b/src/views/Follow/Feed/FollowingFeedHead/styles.css
index 25f55bfe23..28a4b1109d 100644
--- a/src/views/Follow/Feed/FollowingFeedHead/styles.css
+++ b/src/views/Follow/Feed/FollowingFeedHead/styles.css
@@ -4,7 +4,7 @@
& h4 {
@mixin flex-center-start;
- font-size: var(--font-size-sm-s);
+ font-size: var(--font-size-xs);
font-weight: var(--font-weight-normal);
line-height: 1rem;
color: var(--color-grey);
From e86fc724aee6d1a7d42a73a8f658e5126a742c1f Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Tue, 11 Apr 2023 23:40:57 +0700
Subject: [PATCH 75/92] feat(test): add test for payment password input
---
tests/helpers/poms/articleDetail.ts | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tests/helpers/poms/articleDetail.ts b/tests/helpers/poms/articleDetail.ts
index b456f95f02..51f8f4dc54 100644
--- a/tests/helpers/poms/articleDetail.ts
+++ b/tests/helpers/poms/articleDetail.ts
@@ -232,7 +232,15 @@ export class ArticleDetailPage {
// click next step
await this.dialog.getByRole('button', { name: 'Next' }).click()
- // fill payment password
+ // fill incorrect payment password
+ await this.dialog.locator('#field-password-1').fill(password[0])
+ await this.dialog.locator('#field-password-2').fill(password[0])
+ await this.dialog.locator('#field-password-3').fill(password[0])
+ await this.dialog.locator('#field-password-4').fill(password[0])
+ await this.dialog.locator('#field-password-5').fill(password[0])
+ await this.dialog.locator('#field-password-6').fill(password[0])
+
+ // fill correct payment password
await this.dialog.locator('#field-password-1').fill(password[0])
await this.dialog.locator('#field-password-2').fill(password[1])
await this.dialog.locator('#field-password-3').fill(password[2])
From dddc90cff96234737abe6d885483ed5559996fc8 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Wed, 12 Apr 2023 12:32:16 +0700
Subject: [PATCH 76/92] fix(icon): revise nav icons
---
public/static/icons/32px/nav-following.svg | 2 +-
public/static/icons/32px/nav-home-active.svg | 4 ++--
public/static/icons/32px/nav-home.svg | 2 +-
public/static/icons/32px/nav-me-active.svg | 6 +-----
public/static/icons/32px/nav-me.svg | 2 +-
public/static/icons/32px/nav-notification-active.svg | 2 +-
public/static/icons/32px/nav-notification.svg | 2 +-
public/static/icons/32px/nav-search-active.svg | 2 +-
public/static/icons/32px/nav-search.svg | 2 +-
9 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/public/static/icons/32px/nav-following.svg b/public/static/icons/32px/nav-following.svg
index fd2de5ed67..226b1d2bb6 100644
--- a/public/static/icons/32px/nav-following.svg
+++ b/public/static/icons/32px/nav-following.svg
@@ -1,3 +1,3 @@
diff --git a/public/static/icons/32px/nav-home-active.svg b/public/static/icons/32px/nav-home-active.svg
index f7c3e32bdf..d68e1d0300 100644
--- a/public/static/icons/32px/nav-home-active.svg
+++ b/public/static/icons/32px/nav-home-active.svg
@@ -1,3 +1,3 @@
-
diff --git a/src/components/Search/SearchHistory/EmptySearchHistory/index.tsx b/src/components/Search/SearchHistory/EmptySearchHistory/index.tsx
index 2e036bd0a5..83c382cb59 100644
--- a/src/components/Search/SearchHistory/EmptySearchHistory/index.tsx
+++ b/src/components/Search/SearchHistory/EmptySearchHistory/index.tsx
@@ -1,4 +1,4 @@
-import IMAGE_EMPTY_SEARCH_HISTORY from '@/public/static/images/illustration-empty-search-history.png'
+import IMAGE_EMPTY_SEARCH_HISTORY from '@/public/static/images/illustration-empty-search-history.svg'
import { Translate } from '~/components'
import styles from './styles.css'
@@ -6,7 +6,7 @@ import styles from './styles.css'
const EmptySearchHistory = () => {
return (
-
+
Date: Wed, 12 Apr 2023 17:08:53 +0700
Subject: [PATCH 83/92] New translations default.json (Chinese Simplified)
---
lang/zh-Hans.json | 1783 ++++++++++++++++++++++-----------------------
1 file changed, 868 insertions(+), 915 deletions(-)
diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json
index 360d711866..19a81f689d 100644
--- a/lang/zh-Hans.json
+++ b/lang/zh-Hans.json
@@ -1,1297 +1,1250 @@
{
- "cfL5uk": {
- "defaultMessage": "已超过 200 字,目前 {numbers} 字",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ "+7SAix": {
+ "defaultMessage": "2-12 个字符",
+ "description": ""
},
- "3uQKhx": {
- "defaultMessage": "若你希望向 Matters 提出建议,或遭遇操作异常,请发送邮件至",
- "description": "src/views/Help/index.tsx"
+ "+a+2ug": {
+ "defaultMessage": "成员",
+ "description": ""
+ },
+ "+hfUcV": {
+ "defaultMessage": "在围炉 {circlename} 发布了新广播",
+ "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ },
+ "/+XWDi": {
+ "defaultMessage": "航行日志 2.0",
+ "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ },
+ "/3G89K": {
+ "defaultMessage": " 又成长了",
+ "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ },
+ "/3kw6k": {
+ "defaultMessage": "尝试将内容写入 IPFS 网络中,需要一段时间,请耐心等候。若等候时间过久,可通过发布文章来加速。",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ },
+ "/IMR+8": {
+ "defaultMessage": "支持排行榜",
+ "description": ""
+ },
+ "/asuIY": {
+ "defaultMessage": "进入社区",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
"/ns2st": {
"defaultMessage": "下载应用",
"description": ""
},
- "FaTb0A": {
- "defaultMessage": "安装 MetaMask",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "/nu5ho": {
+ "defaultMessage": "回复了你在作品 ",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "FhWC22": {
- "defaultMessage": "社区共建基地",
+ "/podGX": {
+ "defaultMessage": "公开",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
+ },
+ "0Azlrb": {
+ "defaultMessage": "管理",
"description": ""
},
- "Xd0J7Y": {
- "defaultMessage": "开放社区",
+ "1EYCdR": {
+ "defaultMessage": "标签",
"description": ""
},
- "dnsfmR": {
- "defaultMessage": ",我们会尽快回复!",
- "description": "src/views/Help/index.tsx"
+ "1pFLGZ": {
+ "defaultMessage": "漏洞赏金计划",
+ "description": ""
},
- "ZjDH42": {
- "defaultMessage": "关于我们",
+ "1qQzV0": {
+ "defaultMessage": "免费邀请",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ },
+ "20bImY": {
+ "defaultMessage": "众聊",
"description": ""
},
- "6flWFg": {
- "defaultMessage": "用户协议",
+ "2CqWQE": {
+ "defaultMessage": "总数",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ },
+ "2atspc": {
+ "defaultMessage": "我的草稿",
"description": ""
},
- "uVCg1l": {
- "defaultMessage": "玩转 Matters 实用指南",
+ "2eebTb": {
+ "defaultMessage": " 收藏了你的作品",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ },
+ "2slIPX": {
+ "defaultMessage": "我的赞赏",
"description": ""
},
- "HzaRKA": {
- "defaultMessage": "一键搬家",
+ "2uRduT": {
+ "defaultMessage": " 的评论",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ },
+ "2uwwz+": {
+ "defaultMessage": "累计阅读时長代表了你的作品被登入用户阅读的总时数,每次阅读过程超过一定时间后才会计入。此外,同一个用户的多次阅读也会进行累计。",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ },
+ "32bml8": {
+ "defaultMessage": "追踪",
+ "description": "src/components/Layout/SideNav/index.tsx"
+ },
+ "3KNMbJ": {
+ "defaultMessage": "作品",
"description": ""
},
- "fOgusL": {
- "defaultMessage": "选择进入方式",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "3WKlPP": {
+ "defaultMessage": "commented in",
+ "description": ""
},
- "t8/r8X": {
- "defaultMessage": "连接加密钱包",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "3kbIhS": {
+ "defaultMessage": "未命名",
+ "description": ""
},
- "iCFXtS": {
- "defaultMessage": "欢迎未注册或已启用钱包登入的朋友使用",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "3uQKhx": {
+ "defaultMessage": "若你希望向 Matters 提出建议,或遭遇操作异常,请发送邮件至",
+ "description": "src/views/Help/index.tsx"
},
- "xiKjd/": {
- "defaultMessage": "使用电子邮箱",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "3yk8fB": {
+ "defaultMessage": "我的钱包",
+ "description": ""
},
- "J+LXrH": {
- "defaultMessage": "持续支持邮箱進入,未來可随时启用钱包登入",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "3ynsJ3": {
+ "defaultMessage": "想了解更多?详见 ",
+ "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
},
- "XcTMMM": {
- "defaultMessage": "已有帐户?",
- "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
+ "47FYwb": {
+ "defaultMessage": "取消",
+ "description": ""
},
- "ipQlDG": {
- "defaultMessage": "以邮箱登入",
- "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
+ "4Odb0J": {
+ "defaultMessage": "置顶作品",
+ "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
},
- "pwlQEY": {
- "defaultMessage": "姓名",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "4giHJT": {
+ "defaultMessage": "在行动装置上使用问题,参考 ",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "4mbdyI": {
- "defaultMessage": "邮箱",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "4vkwo0": {
+ "defaultMessage": "你的修订作品已发布到分布式网络",
+ "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx"
},
- "0Rw3H/": {
- "defaultMessage": "我已阅读并同意",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "50cquj": {
+ "defaultMessage": "还没有众聊",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
},
- "LphWYP": {
- "defaultMessage": "Matters 用户协议和隐私政策",
+ "5FO4vn": {
+ "defaultMessage": "你尚无权限进行该操作",
"description": ""
},
- "agfumL": {
- "defaultMessage": "下一步",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
- },
- "l5vWO8": {
- "defaultMessage": "你的站内暱称,之后可以修改",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "5sAbzJ": {
+ "defaultMessage": " 众聊中发表话题 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
"5sg7KC": {
"defaultMessage": "密码",
"description": ""
},
- "ml3SZN": {
- "defaultMessage": "至少 8 个字符,支持英文大小写字母、数字和特殊符号",
+ "63HuBz": {
+ "defaultMessage": "此标签目前无人主理",
+ "description": "src/views/TagDetail/Owner/index.tsx"
+ },
+ "69+D96": {
+ "defaultMessage": "开始创作",
"description": ""
},
- "NzfL1d": {
- "defaultMessage": "再次输入密码",
- "description": "src/components/Forms/EmailSignUpForm/Password.tsx"
+ "6BXcdo": {
+ "defaultMessage": "设定围炉门槛(每月)",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
- "XH0Lb6": {
- "defaultMessage": "欢迎加入 Matters!",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "6OBAOi": {
+ "defaultMessage": "目前总订阅人数",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "stjoBH": {
- "defaultMessage": "现在,去为你喜欢的作者打赏吧!你的每一次打赏都将为作者带来收入。",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "6flWFg": {
+ "defaultMessage": "用户协议",
+ "description": ""
},
- "reOeq5": {
- "defaultMessage": "你已拥有个人创作空间站,期待你的第一篇作品。",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "77tYPg": {
+ "defaultMessage": "确认删除后,{commentType}会立即消失。",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "ANhCde": {
- "defaultMessage": "马上开始你的创作吧!",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "7DIW6+": {
+ "defaultMessage": "了解更多",
+ "description": ""
},
- "/asuIY": {
- "defaultMessage": "进入社区",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "7xnrxG": {
+ "defaultMessage": "作品已添加至精选",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
},
- "nsaJRn": {
- "defaultMessage": "上站成功",
+ "8KFsZN": {
+ "defaultMessage": "阅读次数",
"description": ""
},
- "lD4FPZ": {
- "defaultMessage": "请输入邮箱",
+ "8cv9D4": {
+ "defaultMessage": "Next Step",
"description": ""
},
- "IFY8r4": {
- "defaultMessage": "请输入密码",
- "description": "src/components/Forms/EmailLoginForm/index.tsx"
+ "8xPi0N": {
+ "defaultMessage": "离开围炉",
+ "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
},
- "z+209N": {
- "defaultMessage": "注册",
+ "9+Ddtu": {
+ "defaultMessage": "下一步",
"description": ""
},
- "nYeDrI": {
- "defaultMessage": "沒有帐户?",
- "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
+ "9nNpKP": {
+ "defaultMessage": "讨论已送出",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
},
- "xGh9O7": {
- "defaultMessage": "提醒:信箱将不作为登入使用,仅作为联系渠道",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A3LOng": {
+ "defaultMessage": " 众聊中回复话题 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "N3K1H9": {
- "defaultMessage": "Matters 不会透过任何渠道询问你的钱包私钥。",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A3rLZt": {
+ "defaultMessage": "最近 {months} 个月",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "hWs95P": {
- "defaultMessage": "重要讯息将透过邮件通知,请填入信箱完成设定。",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A3wDZ8": {
+ "defaultMessage": "我的 NFT 收藏",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
},
- "cg1VJ2": {
- "defaultMessage": "连接加密钱包",
+ "A41QIy": {
+ "defaultMessage": "Enter Password",
"description": ""
},
- "YjNkcK": {
- "defaultMessage": "若要变更地址,请直接操作钱包切換",
+ "A7ugfn": {
+ "defaultMessage": "更多操作",
"description": ""
},
- "wSEOxH": {
- "defaultMessage": "联系渠道",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "CwSpld": {
- "defaultMessage": "非登入用途",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A8MpFX": {
+ "defaultMessage": "请输入个人简介",
+ "description": ""
},
- "qswU4E": {
- "defaultMessage": "邮箱将不作为登入使用,仅作为联系渠道",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "AGcU5J": {
+ "defaultMessage": "置顶",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "EfJYPI": {
- "defaultMessage": "验证码",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "ANA7sk": {
+ "defaultMessage": "主理",
+ "description": "src/views/TagDetail/Owner/index.tsx"
},
- "jgLiba": {
- "defaultMessage": "请输入验证码",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "ANhCde": {
+ "defaultMessage": "马上开始你的创作吧!",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "jL2ZHb": {
- "defaultMessage": "验证码有效期 20 分钟",
- "description": ""
+ "AYTnjk": {
+ "defaultMessage": "追踪",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "4giHJT": {
- "defaultMessage": "在行动装置上使用问题,参考 ",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "BHFHeY": {
+ "defaultMessage": " 在围炉 {commentCircle}",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "uw32VR": {
- "defaultMessage": "教学指南",
+ "Bc20la": {
+ "defaultMessage": "天",
"description": ""
},
- "hrfF+i": {
- "defaultMessage": "刚接触加密钱包?参考 ",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
- },
- "HxcjQl": {
- "defaultMessage": "Matters 将提供更多创作与区块链结合的服务,接入钱包后即可在未来第一时间体验新功能。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
- },
- "LqxIEU": {
- "defaultMessage": "钱包地址将作为身份识别之一在个人页公开显示。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "Bjdw71": {
+ "defaultMessage": "目前总追踪人数",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "UOdEqi": {
- "defaultMessage": "原有透过电子信箱登入方式将为你保留。为维护你的帐户安全,加密钱包连接后无法重设。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "BjzRe8": {
+ "defaultMessage": ",快去查看自己的收入吧!",
+ "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
- "VrOoVf": {
- "defaultMessage": "Matters 不会透过任何渠道主动询问你的钱包私钥。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "CBDDR5": {
+ "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
+ "description": ""
},
- "v6YjIn": {
- "defaultMessage": "账户",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "Cdkhl8": {
+ "defaultMessage": "刪除{commentType}",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "H8KGyc": {
- "defaultMessage": "进入",
+ "CnPG8j": {
+ "defaultMessage": "精华",
"description": ""
},
- "sy+pv5": {
- "defaultMessage": "邮箱",
+ "Cu3Cty": {
+ "defaultMessage": "月",
"description": ""
},
- "JxlxVc": {
- "defaultMessage": "忘记密码?",
- "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
+ "CwSpld": {
+ "defaultMessage": "非登入用途",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "deEeEI": {
- "defaultMessage": "注册",
- "description": ""
+ "D2Sw/t": {
+ "defaultMessage": "添加以下任一网址到 RSS 阅读器",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "N2IrpM": {
- "defaultMessage": "确认",
+ "D3idYv": {
+ "defaultMessage": "设定",
"description": ""
},
- "EwVnoC": {
- "defaultMessage": "我已阅读并同意",
- "description": ""
+ "DMlmcU": {
+ "defaultMessage": "免费资格",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "9+Ddtu": {
- "defaultMessage": "下一步",
+ "DXJ8ys": {
+ "defaultMessage": "阅读次数代表了你的作品被登入用户阅读的总次数,每次阅读过程超过一定时间后才会计入。此外,同一个用户的多次阅读也会进行累计。",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ },
+ "E8W3qa": {
+ "defaultMessage": "2-20 个字符",
"description": ""
},
- "k5NnNF": {
- "defaultMessage": "追踪了你",
- "description": "src/components/Notice/UserNotice/UserNewFollowerNotice.tsx"
+ "EQeKnO": {
+ "defaultMessage": "邀请管理",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "KZlRde": {
- "defaultMessage": " 关联了你的作品 ",
- "description": "src/components/Notice/ArticleArticleNotice/ArticleNewCollectedNotice.tsx"
+ "EW5R4p": {
+ "defaultMessage": "催更、提问、分享、讨论…",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
},
- "/nu5ho": {
- "defaultMessage": "回复了你在作品 ",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
+ "EfJYPI": {
+ "defaultMessage": "验证码",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "ZUPQzl": {
- "defaultMessage": " 的评论",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
+ "EoNvLu": {
+ "defaultMessage": "创作了",
+ "description": "src/views/User/Articles/UserArticles.tsx"
},
- "b+LSgI": {
- "defaultMessage": "回复了你在围炉 ",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
+ "EwVnoC": {
+ "defaultMessage": "我已阅读并同意",
+ "description": ""
},
- "aaUBvF": {
- "defaultMessage": " 中的发言",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
+ "FALWef": {
+ "defaultMessage": " 广播中留言 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
},
- "DIQKiC": {
- "defaultMessage": " 在作品 ",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "FOOymB": {
+ "defaultMessage": "还没有成员",
+ "description": "src/views/Circle/Profile/MembersDialog/Content.tsx"
},
- "jqACL/": {
- "defaultMessage": " 的评论中提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "FaTb0A": {
+ "defaultMessage": "安装 MetaMask",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "+AdTsY": {
- "defaultMessage": " 众聊提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "Fe682o": {
+ "defaultMessage": "下月预期营收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "ISn3eZ": {
- "defaultMessage": " 广播提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "FhWC22": {
+ "defaultMessage": "社区共建基地",
+ "description": ""
},
- "uqmi/b": {
- "defaultMessage": " 置顶了你在作品 ",
- "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ "FmWYRt": {
+ "defaultMessage": "免费资格时长",
+ "description": ""
},
- "VjxGd7": {
- "defaultMessage": "评论了作品 ",
- "description": "src/components/Notice/CommentNotice/ArticleNewCommentNotice.tsx"
+ "GBm/sD": {
+ "defaultMessage": " 众聊中发表话题,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "U/Tqmx": {
- "defaultMessage": "评论了你收藏的作品 ",
- "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx"
+ "GRtGnZ": {
+ "defaultMessage": "辞去权限",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "VoOZni": {
- "defaultMessage": "在围炉 ",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ "GZJpDf": {
+ "defaultMessage": "数据后台",
+ "description": ""
},
- "oaDToH": {
- "defaultMessage": " 发布了新广播",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ "GugBCe": {
+ "defaultMessage": "本月新增追踪人数",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "qPPrzm": {
- "defaultMessage": " 支持了你的作品 ",
- "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
+ "H0JBH6": {
+ "defaultMessage": "登出",
+ "description": ""
},
- "BjzRe8": {
- "defaultMessage": ",快去查看自己的收入吧!",
- "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
+ "H8KGyc": {
+ "defaultMessage": "进入",
+ "description": ""
},
- "z4NaU2": {
- "defaultMessage": "你的 ",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
+ "HFVDeB": {
+ "defaultMessage": "相关标签",
+ "description": "src/views/TagDetail/RelatedTags/index.tsx"
},
- "bVZDVx": {
- "defaultMessage": " 提现流程已开始,到帐时间请关注银行提醒。",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
+ "HtSDyc": {
+ "defaultMessage": "帮助中心",
+ "description": ""
},
- "nto8ly": {
- "defaultMessage": "订阅了你的围炉",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "HxcjQl": {
+ "defaultMessage": "Matters 将提供更多创作与区块链结合的服务,接入钱包后即可在未来第一时间体验新功能。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "qYzBk8": {
- "defaultMessage": "退订了你的围炉",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "HzaRKA": {
+ "defaultMessage": "一键搬家",
+ "description": ""
},
- "LW1aX1": {
- "defaultMessage": "恭喜你!",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "IFY8r4": {
+ "defaultMessage": "请输入密码",
+ "description": "src/components/Forms/EmailLoginForm/index.tsx"
},
- "KyWDUu": {
- "defaultMessage": " 邀请你免费加入围炉 ",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "Ic4hqD": {
+ "defaultMessage": "字",
+ "description": "src/views/User/Articles/UserArticles.tsx"
},
- "jF+Mle": {
- "defaultMessage": " 天,前去免费体验,与大家谈天说地吧。",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "J+LXrH": {
+ "defaultMessage": "持续支持邮箱進入,未來可随时启用钱包登入",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "wqaNK4": {
- "defaultMessage": "在你的围炉 ",
+ "J+dIsA": {
+ "defaultMessage": "订阅",
"description": ""
},
- "FALWef": {
- "defaultMessage": " 广播中留言 ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
+ "J3yk6u": {
+ "defaultMessage": "在围炉 ",
+ "description": ""
},
- "YlxpJl": {
- "defaultMessage": " 广播中留言,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
+ "JIjMWL": {
+ "defaultMessage": "你的作品已发布到分布式网络",
+ "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx"
},
- "qQmSxu": {
- "defaultMessage": "你已成功登记参加空投且完成以太坊钱包设定,空投活动将在 2021/11/12 进行。你设定的空投地址:",
- "description": "src/components/Notice/CryptoNotice/CryptoWalletAirdropNotice.tsx"
+ "JXdbo8": {
+ "defaultMessage": "完成",
+ "description": ""
},
- "UgvfcU": {
- "defaultMessage": "你已完成以太坊钱包设定。你设定的地址:",
- "description": "src/components/Notice/CryptoNotice/CryptoWalletConnectedNotice.tsx"
+ "Jc+W6M": {
+ "defaultMessage": " 辞去了标签主理人权限,你要不要试试看成为新的主理人?",
+ "description": "src/components/Notice/TagNotice/TagLeaveNotice.tsx"
},
- "+hfUcV": {
- "defaultMessage": "在围炉 {circlename} 发布了新广播",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ "JpS59y": {
+ "defaultMessage": "已接受",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
},
- "An0rpe": {
- "defaultMessage": "{circlename} 广播中留言 ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
+ "Js/Fij": {
+ "defaultMessage": "作品已取消精选",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
},
- "VO4Elt": {
- "defaultMessage": " 在作品 {commentArticle} 的评论中提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "JxlxVc": {
+ "defaultMessage": "忘记密码?",
+ "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
},
- "BHFHeY": {
- "defaultMessage": " 在围炉 {commentCircle}",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "K3r6DQ": {
+ "defaultMessage": "刪除",
+ "description": ""
},
- "5sAbzJ": {
- "defaultMessage": " 众聊中发表话题 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "KL502d": {
+ "defaultMessage": "资料已保存",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
},
- "A3LOng": {
- "defaultMessage": " 众聊中回复话题 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "KLQ1/z": {
+ "defaultMessage": "围炉创建成功",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "ftD7Hy": {
- "defaultMessage": " 众聊提及了你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "KMcrz8": {
+ "defaultMessage": "认领",
+ "description": "src/views/TagDetail/Owner/index.tsx"
},
- "g/L3Fm": {
- "defaultMessage": " 众聊中发表与回复话题 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "KZlRde": {
+ "defaultMessage": " 关联了你的作品 ",
+ "description": "src/components/Notice/ArticleArticleNotice/ArticleNewCollectedNotice.tsx"
},
- "GBm/sD": {
- "defaultMessage": " 众聊中发表话题,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "KyWDUu": {
+ "defaultMessage": " 邀请你免费加入围炉 ",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "tQsujN": {
- "defaultMessage": " 众聊中回复话题,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "L0J61B": {
+ "defaultMessage": "免费",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "uuEGON": {
- "defaultMessage": " 众聊中发表与回复话题,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "L4NXXh": {
+ "defaultMessage": "目前总营收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "J3yk6u": {
- "defaultMessage": "在围炉 ",
- "description": ""
+ "L7Si5/": {
+ "defaultMessage": "管理社群",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "hk2aiz": {
- "defaultMessage": " 追踪了你的围炉",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "LGox1K": {
+ "defaultMessage": "已追踪",
+ "description": ""
},
- "mPe6DK": {
- "defaultMessage": " 订阅了你的围炉",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "LOefol": {
+ "defaultMessage": "上锁",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
},
- "JIjMWL": {
- "defaultMessage": "你的作品已发布到分布式网络",
- "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx"
+ "LW1aX1": {
+ "defaultMessage": "恭喜你!",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "sncOwi": {
- "defaultMessage": " 在作品中提及你",
- "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx"
+ "Lc/azT": {
+ "defaultMessage": "IPNS 订阅",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "2eebTb": {
- "defaultMessage": " 收藏了你的作品",
- "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ "LphWYP": {
+ "defaultMessage": "Matters 用户协议和隐私政策",
+ "description": ""
},
- "YIes/F": {
- "defaultMessage": "等 {actorsCount} 人",
- "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ "LqxIEU": {
+ "defaultMessage": "钱包地址将作为身份识别之一在个人页公开显示。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "PjT72J": {
- "defaultMessage": "喜欢并赞赏了你的作品",
- "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx"
+ "MDNaxs": {
+ "defaultMessage": "人",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "4vkwo0": {
- "defaultMessage": "你的修订作品已发布到分布式网络",
- "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx"
+ "MkwOFW": {
+ "defaultMessage": "浏览记录",
+ "description": ""
},
- "QV19cI": {
- "defaultMessage": "你的修订作品发布失败",
- "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx"
+ "N2IrpM": {
+ "defaultMessage": "确认",
+ "description": ""
},
- "euNJsE": {
- "defaultMessage": "新作品已经加入围炉,马上前往阅读吧!",
- "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ "N3K1H9": {
+ "defaultMessage": "Matters 不会透过任何渠道询问你的钱包私钥。",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "/3G89K": {
- "defaultMessage": " 又成长了",
- "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ "NAidKb": {
+ "defaultMessage": "通知",
+ "description": ""
},
- "xwj01D": {
- "defaultMessage": " 邀请你成为标签的协作者",
- "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx"
+ "NONfAh": {
+ "defaultMessage": "豆瓣",
+ "description": "src/components/Share/Buttons/Douban.tsx"
},
- "t7ah39": {
- "defaultMessage": " 成为了标签的主理人,你的作品也在其中。快来看看其他作者的精彩创作吧",
- "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx"
+ "NzfL1d": {
+ "defaultMessage": "再次输入密码",
+ "description": "src/components/Forms/EmailSignUpForm/Password.tsx"
},
"O03Rkc": {
"defaultMessage": " 辞去了权限。你可以邀请新的协作者加入了",
"description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
},
- "dsBCfK": {
- "defaultMessage": "哎呀,标签协作者",
- "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
+ "O0QB1v": {
+ "defaultMessage": "用户将收到你的围炉免费资格邀请函,设置免费的时限,邀请他们一起加入吧!",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "Jc+W6M": {
- "defaultMessage": " 辞去了标签主理人权限,你要不要试试看成为新的主理人?",
- "description": "src/components/Notice/TagNotice/TagLeaveNotice.tsx"
+ "OIj8pQ": {
+ "defaultMessage": "成功发送邀请",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
+ },
+ "OKhRC6": {
+ "defaultMessage": "分享",
+ "description": ""
+ },
+ "PjT72J": {
+ "defaultMessage": "喜欢并赞赏了你的作品",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx"
},
- "OKhRC6": {
- "defaultMessage": "分享",
+ "Po+kJe": {
+ "defaultMessage": "最近 {month} 个月",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
+ },
+ "Pp/0po": {
+ "defaultMessage": "换一批",
"description": ""
},
- "u5aHb4": {
- "defaultMessage": "复制链接",
+ "Q8Qw5B": {
+ "defaultMessage": "个人简介",
"description": ""
},
- "NONfAh": {
- "defaultMessage": "豆瓣",
- "description": "src/components/Share/Buttons/Douban.tsx"
+ "QCo7Gc": {
+ "defaultMessage": "选择 NFT 作为你的头像",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
},
- "rBjwQy": {
- "defaultMessage": "微博",
- "description": "src/components/Share/Buttons/Weibo.tsx"
+ "QUqfbW": {
+ "defaultMessage": "说说围炉的有趣之处,吸引支持者加入",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "bBYO6x": {
- "defaultMessage": "取消屏蔽",
- "description": "src/components/BlockUser/Button/index.tsx"
+ "QV19cI": {
+ "defaultMessage": "你的修订作品发布失败",
+ "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx"
},
- "vAc1Bw": {
- "defaultMessage": "封锁用户",
- "description": ""
+ "QZXKhG": {
+ "defaultMessage": "设置围炉网址(创建后不可修改)",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
- "mSAY3/": {
- "defaultMessage": "已取消屏蔽。该用户现在可以评论你的作品和围炉。",
- "description": "src/components/BlockUser/Button/index.tsx"
+ "RFzVUD": {
+ "defaultMessage": "取消置顶",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "wEQDC6": {
- "defaultMessage": "编辑资料",
+ "RxiHr/": {
+ "defaultMessage": "还没有任何用户回覆你的邀请喔!",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
+ },
+ "SENRqu": {
+ "defaultMessage": "Help",
"description": ""
},
- "/+XWDi": {
- "defaultMessage": "航行日志 2.0",
- "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ "SNh1n0": {
+ "defaultMessage": "查看名单",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "qyzJxi": {
- "defaultMessage": "航行日志 1.0",
- "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ "SdXoXI": {
+ "defaultMessage": "你已寄出邀请给朋友们,快去已邀请管理查看他们加入的进度吧!",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
},
- "A7ugfn": {
- "defaultMessage": "更多操作",
+ "Seanpx": {
+ "defaultMessage": "Required",
"description": ""
},
- "b1FfGy": {
- "defaultMessage": "内容订阅",
- "description": "src/components/UserProfile/index.tsx"
- },
- "/3kw6k": {
- "defaultMessage": "尝试将内容写入 IPFS 网络中,需要一段时间,请耐心等候。若等候时间过久,可通过发布文章来加速。",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "Szd1tH": {
+ "defaultMessage": "登出失败,再来一次",
+ "description": ""
},
- "Lc/azT": {
- "defaultMessage": "IPNS 订阅",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "TQLBox": {
+ "defaultMessage": "取消置顶",
+ "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
},
- "cf37Zy": {
- "defaultMessage": "添加 IPFS 生成的 IPNS 指纹到阅读器,如:",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "TSDiqB": {
+ "defaultMessage": "付费人数",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "zxlwbc": {
- "defaultMessage": "等待写入完成...",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "TjWWxF": {
+ "defaultMessage": "广播已送出",
+ "description": "src/views/Circle/Broadcast/Broadcast.tsx"
},
- "gMZfHO": {
- "defaultMessage": "RSS 订阅",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "TzhzIH": {
+ "defaultMessage": "创作者",
+ "description": ""
},
- "D2Sw/t": {
- "defaultMessage": "添加以下任一网址到 RSS 阅读器",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "U/Tqmx": {
+ "defaultMessage": "评论了你收藏的作品 ",
+ "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx"
},
- "rf0ew3": {
- "defaultMessage": "快来搭建围炉,呼召你的支持者加入!",
- "description": "src/components/UserProfile/CircleWidget/index.tsx"
+ "U9IXic": {
+ "defaultMessage": "添加作品",
+ "description": "src/views/Circle/Profile/AddCircleArticle/Button.tsx"
},
- "pzTOmv": {
- "defaultMessage": "追踪者",
+ "UNUROl": {
+ "defaultMessage": "建议 50 字以内,最长 200 字",
"description": ""
},
- "i/4KO2": {
- "defaultMessage": "此帐户因为违反社区约章而被注销",
- "description": "src/components/UserProfile/index.tsx"
- },
- "oNYnCM": {
- "defaultMessage": "已注销用户",
- "description": "src/components/UserProfile/index.tsx"
+ "UOdEqi": {
+ "defaultMessage": "原有透过电子信箱登入方式将为你保留。为维护你的帐户安全,加密钱包连接后无法重设。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "rs0YS2": {
- "defaultMessage": "已禁言用户",
- "description": "src/components/UserProfile/index.tsx"
+ "UgvfcU": {
+ "defaultMessage": "你已完成以太坊钱包设定。你设定的地址:",
+ "description": "src/components/Notice/CryptoNotice/CryptoWalletConnectedNotice.tsx"
},
- "EoNvLu": {
- "defaultMessage": "创作了",
- "description": "src/views/User/Articles/UserArticles.tsx"
+ "UjKkhq": {
+ "defaultMessage": "作品已添加标签",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
"UxfPXa": {
"defaultMessage": "累积创作",
"description": "src/views/User/Articles/UserArticles.tsx"
},
- "Ic4hqD": {
- "defaultMessage": "字",
- "description": "src/views/User/Articles/UserArticles.tsx"
+ "VO4Elt": {
+ "defaultMessage": " 在作品 {commentArticle} 的评论中提及你",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "J+dIsA": {
- "defaultMessage": "订阅",
- "description": ""
+ "VjxGd7": {
+ "defaultMessage": "评论了作品 ",
+ "description": "src/components/Notice/CommentNotice/ArticleNewCommentNotice.tsx"
},
- "3KNMbJ": {
- "defaultMessage": "作品",
- "description": ""
+ "VrOoVf": {
+ "defaultMessage": "Matters 不会透过任何渠道主动询问你的钱包私钥。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ },
+ "VwuiYK": {
+ "defaultMessage": "Oops!此网址名称已被使用了,换一个试试",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
"WBVVYd": {
"defaultMessage": "回应",
"description": ""
},
- "1EYCdR": {
- "defaultMessage": "标签",
- "description": ""
- },
- "sT9HoG": {
- "defaultMessage": "欢迎加入 Matters,一个自由、自主、永续的创作与公共讨论空间。",
- "description": "src/views/Follow/PickAuthors/index.tsx"
- },
- "7DIW6+": {
- "defaultMessage": "了解更多",
- "description": ""
- },
- "Z6ewE3": {
- "defaultMessage": "参与开发",
- "description": "src/views/Me/Settings/AnonymousSettings/Enhance/index.tsx"
- },
- "1pFLGZ": {
- "defaultMessage": "漏洞赏金计划",
- "description": ""
+ "WSUAwk": {
+ "defaultMessage": "添加到精选",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
},
- "mk+LCk": {
- "defaultMessage": "界面设定",
- "description": "src/views/Me/Settings/AnonymousSettings/DisplayPreferences/index.tsx"
+ "WpvsPu": {
+ "defaultMessage": "订阅",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "y1Z3or": {
- "defaultMessage": "修改介面语言",
- "description": ""
+ "WuvE8X": {
+ "defaultMessage": "{circleName} 的追踪者",
+ "description": "src/views/Circle/Profile/FollowersDialog/index.tsx"
},
- "itPgxd": {
- "defaultMessage": "个人主页",
- "description": ""
+ "X+Xvgq": {
+ "defaultMessage": "取消精选",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "vH8sCb": {
- "defaultMessage": "我的围炉",
- "description": ""
+ "XH0Lb6": {
+ "defaultMessage": "欢迎加入 Matters!",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "2atspc": {
- "defaultMessage": "我的草稿",
- "description": ""
+ "XHMco9": {
+ "defaultMessage": "人",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "3yk8fB": {
- "defaultMessage": "我的钱包",
+ "XVYrS/": {
+ "defaultMessage": "还没有追踪者",
"description": ""
},
- "GZJpDf": {
- "defaultMessage": "数据后台",
- "description": ""
+ "XcTMMM": {
+ "defaultMessage": "已有帐户?",
+ "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
},
- "nGBrvw": {
- "defaultMessage": "我的收藏",
+ "Xd0J7Y": {
+ "defaultMessage": "开放社区",
"description": ""
},
- "2slIPX": {
- "defaultMessage": "我的赞赏",
+ "XgdZSb": {
+ "defaultMessage": "值得关注",
"description": ""
},
- "2uRduT": {
- "defaultMessage": " 的评论",
- "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
- },
- "MkwOFW": {
- "defaultMessage": "浏览记录",
- "description": ""
+ "Xz/AHp": {
+ "defaultMessage": "broadcast and mentioned you",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "fG41Ux": {
- "defaultMessage": "登出成功",
- "description": ""
+ "YIes/F": {
+ "defaultMessage": "等 {actorsCount} 人",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
},
- "Szd1tH": {
- "defaultMessage": "登出失败,再来一次",
+ "YjNkcK": {
+ "defaultMessage": "若要变更地址,请直接操作钱包切換",
"description": ""
},
- "HtSDyc": {
- "defaultMessage": "帮助中心",
- "description": ""
+ "YlxpJl": {
+ "defaultMessage": " 广播中留言,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
},
- "D3idYv": {
- "defaultMessage": "设定",
- "description": ""
+ "Z6cII7": {
+ "defaultMessage": "累计阅读时数",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
},
- "H0JBH6": {
- "defaultMessage": "登出",
- "description": ""
+ "Z6ewE3": {
+ "defaultMessage": "参与开发",
+ "description": "src/views/Me/Settings/AnonymousSettings/Enhance/index.tsx"
},
- "cE4Hfw": {
- "defaultMessage": "发现",
- "description": ""
+ "ZAs170": {
+ "defaultMessage": "基本资料",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "NAidKb": {
- "defaultMessage": "通知",
- "description": ""
+ "ZUPQzl": {
+ "defaultMessage": " 的评论",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "enMIYK": {
- "defaultMessage": "我的",
- "description": ""
+ "ZVoJan": {
+ "defaultMessage": "修订作品",
+ "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx"
},
- "xmcVZ0": {
- "defaultMessage": "搜索",
+ "ZjDH42": {
+ "defaultMessage": "关于我们",
"description": ""
},
- "47FYwb": {
- "defaultMessage": "取消",
- "description": ""
+ "aa0nss": {
+ "defaultMessage": "取消精选",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
},
- "ll/ufR": {
- "defaultMessage": "热门",
- "description": ""
+ "aaUBvF": {
+ "defaultMessage": " 中的发言",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
"adThp5": {
"defaultMessage": "最新",
"description": ""
},
- "CnPG8j": {
- "defaultMessage": "精华",
- "description": ""
+ "b+LSgI": {
+ "defaultMessage": "回复了你在围炉 ",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "wbcwKd": {
- "defaultMessage": "查看全部",
- "description": ""
+ "b1FfGy": {
+ "defaultMessage": "内容订阅",
+ "description": "src/components/UserProfile/index.tsx"
},
- "XgdZSb": {
- "defaultMessage": "值得关注",
- "description": ""
+ "b3onWZ": {
+ "defaultMessage": "最近 {days} 天",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "kc79d3": {
- "defaultMessage": "找你想看的",
- "description": ""
+ "b8ogKp": {
+ "defaultMessage": "新增邀请",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx"
},
- "Pp/0po": {
- "defaultMessage": "换一批",
+ "bBYO6x": {
+ "defaultMessage": "取消屏蔽",
+ "description": "src/components/BlockUser/Button/index.tsx"
+ },
+ "beLe/F": {
+ "defaultMessage": "广播",
"description": ""
},
- "6gOpfl": {
- "defaultMessage": "暂时隐藏公告栏 7 天",
- "description": "src/views/Home/Announcements/index.tsx"
+ "cE4Hfw": {
+ "defaultMessage": "发现",
+ "description": ""
},
- "3kbIhS": {
- "defaultMessage": "未命名",
+ "cd/II9": {
+ "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}",
"description": ""
},
- "MW9PzQ": {
- "defaultMessage": "Top Supporters",
- "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ "cf37Zy": {
+ "defaultMessage": "添加 IPFS 生成的 IPNS 指纹到阅读器,如:",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "cmtHjM": {
- "defaultMessage": "由于你尚未发布任何作品,这裡还没有任何数据能与你分享哦!发布第一篇作品来介绍你自己,以此开启你的创作之旅吧!",
- "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ "cfL5uk": {
+ "defaultMessage": "已超过 200 字,目前 {numbers} 字",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
},
- "69+D96": {
- "defaultMessage": "开始创作",
+ "cg1VJ2": {
+ "defaultMessage": "连接加密钱包",
"description": ""
},
- "3ynsJ3": {
- "defaultMessage": "想了解更多?详见 ",
+ "cmtHjM": {
+ "defaultMessage": "由于你尚未发布任何作品,这裡还没有任何数据能与你分享哦!发布第一篇作品来介绍你自己,以此开启你的创作之旅吧!",
"description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
},
- "0Azlrb": {
- "defaultMessage": "管理",
- "description": ""
+ "d4waan": {
+ "defaultMessage": "营收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "eXDZGQ": {
- "defaultMessage": "主理人",
+ "deEeEI": {
+ "defaultMessage": "注册",
"description": ""
},
"dg3JCQ": {
"defaultMessage": "协作者",
"description": ""
},
- "TzhzIH": {
- "defaultMessage": "创作者",
- "description": ""
- },
- "Pdx3j1": {
- "defaultMessage": "创作新的作品",
- "description": "src/views/TagDetail/Buttons/AddButton/CreateDraftMenuItem/index.tsx"
- },
- "5FO4vn": {
- "defaultMessage": "你尚无权限进行该操作",
- "description": ""
+ "dnsfmR": {
+ "defaultMessage": ",我们会尽快回复!",
+ "description": "src/views/Help/index.tsx"
},
- "8ttGfR": {
- "defaultMessage": "添加我的作品",
- "description": "src/views/TagDetail/Buttons/AddButton/AddMyArticlesButton/index.tsx"
+ "dsBCfK": {
+ "defaultMessage": "哎呀,标签协作者",
+ "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
},
- "ieGrWo": {
- "defaultMessage": "追踪",
+ "eTpiYa": {
+ "defaultMessage": "尚无支持数据",
"description": ""
},
- "izWS4J": {
- "defaultMessage": "取消追踪",
+ "eXDZGQ": {
+ "defaultMessage": "主理人",
"description": ""
},
- "LGox1K": {
- "defaultMessage": "已追踪",
- "description": ""
+ "ei+kyp": {
+ "defaultMessage": "围炉名称",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "ikVIu3": {
- "defaultMessage": "篇作品",
+ "enMIYK": {
+ "defaultMessage": "我的",
"description": ""
},
- "HFVDeB": {
- "defaultMessage": "相关标签",
- "description": "src/views/TagDetail/RelatedTags/index.tsx"
- },
- "o2Na0B": {
- "defaultMessage": "返回全部",
+ "eov+J2": {
+ "defaultMessage": "自定义网址名称",
"description": ""
},
- "KMcrz8": {
- "defaultMessage": "认领",
- "description": "src/views/TagDetail/Owner/index.tsx"
- },
- "63HuBz": {
- "defaultMessage": "此标签目前无人主理",
- "description": "src/views/TagDetail/Owner/index.tsx"
- },
- "UjKkhq": {
- "defaultMessage": "作品已添加标签",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
- },
- "GRtGnZ": {
- "defaultMessage": "辞去权限",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
- },
- "L7Si5/": {
- "defaultMessage": "管理社群",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
- },
- "ySGgTo": {
- "defaultMessage": "添加精选",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
- },
- "beLe/F": {
- "defaultMessage": "广播",
- "description": ""
+ "euNJsE": {
+ "defaultMessage": "新作品已经加入围炉,马上前往阅读吧!",
+ "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
},
- "20bImY": {
- "defaultMessage": "众聊",
+ "fG41Ux": {
+ "defaultMessage": "登出成功",
"description": ""
},
- "jx7Hn3": {
- "defaultMessage": "作品",
- "description": ""
+ "fOgusL": {
+ "defaultMessage": "选择进入方式",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "U9IXic": {
- "defaultMessage": "添加作品",
- "description": "src/views/Circle/Profile/AddCircleArticle/Button.tsx"
+ "fWDtpq": {
+ "defaultMessage": "邀请中",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
},
- "q+N5Wd": {
- "defaultMessage": "管理围炉",
- "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
+ "ftD7Hy": {
+ "defaultMessage": " 众聊提及了你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "8xPi0N": {
- "defaultMessage": "离开围炉",
- "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
+ "g/L3Fm": {
+ "defaultMessage": " 众聊中发表与回复话题 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "WuvE8X": {
- "defaultMessage": "{circleName} 的追踪者",
- "description": "src/views/Circle/Profile/FollowersDialog/index.tsx"
+ "gMZfHO": {
+ "defaultMessage": "RSS 订阅",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "XVYrS/": {
- "defaultMessage": "还没有追踪者",
- "description": ""
+ "h9CG9E": {
+ "defaultMessage": "{commentType}已刪除",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "+a+2ug": {
- "defaultMessage": "成员",
- "description": ""
+ "hWs95P": {
+ "defaultMessage": "重要讯息将透过邮件通知,请填入信箱完成设定。",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "KL502d": {
- "defaultMessage": "资料已保存",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ "hYG5fb": {
+ "defaultMessage": "人追踪",
+ "description": "src/views/TagDetail/Followers/index.tsx"
},
- "rfz/fN": {
- "defaultMessage": "建议封面尺寸 1600 x 900 像素",
- "description": ""
+ "hk2aiz": {
+ "defaultMessage": " 追踪了你的围炉",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "lhaIoi": {
- "defaultMessage": "请输入姓名",
- "description": ""
+ "hrfF+i": {
+ "defaultMessage": "刚接触加密钱包?参考 ",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "E8W3qa": {
- "defaultMessage": "2-20 个字符",
+ "hrgo+E": {
+ "defaultMessage": "隐藏",
"description": ""
},
- "Q8Qw5B": {
- "defaultMessage": "个人简介",
- "description": ""
+ "i/4KO2": {
+ "defaultMessage": "此帐户因为违反社区约章而被注销",
+ "description": "src/components/UserProfile/index.tsx"
},
- "A8MpFX": {
- "defaultMessage": "请输入个人简介",
- "description": ""
+ "iCFXtS": {
+ "defaultMessage": "欢迎未注册或已启用钱包登入的朋友使用",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "UNUROl": {
- "defaultMessage": "建议 50 字以内,最长 200 字",
+ "ieGrWo": {
+ "defaultMessage": "追踪",
"description": ""
},
- "jvo0vs": {
- "defaultMessage": "保存",
+ "ikVIu3": {
+ "defaultMessage": "篇作品",
"description": ""
},
- "A3wDZ8": {
- "defaultMessage": "我的 NFT 收藏",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
- },
- "QCo7Gc": {
- "defaultMessage": "选择 NFT 作为你的头像",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
+ "ipQlDG": {
+ "defaultMessage": "以邮箱登入",
+ "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
},
- "eTpiYa": {
- "defaultMessage": "尚无支持数据",
+ "itPgxd": {
+ "defaultMessage": "个人主页",
"description": ""
},
- "/IMR+8": {
- "defaultMessage": "支持排行榜",
+ "izWS4J": {
+ "defaultMessage": "取消追踪",
"description": ""
},
- "b3onWZ": {
- "defaultMessage": "最近 {days} 天",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
- },
- "Po+kJe": {
- "defaultMessage": "最近 {month} 个月",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
+ "jF+Mle": {
+ "defaultMessage": " 天,前去免费体验,与大家谈天说地吧。",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "A3rLZt": {
- "defaultMessage": "最近 {months} 个月",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
+ "jJ1Brc": {
+ "defaultMessage": "喜欢回应",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "zQvVDJ": {
- "defaultMessage": "全部",
+ "jL2ZHb": {
+ "defaultMessage": "验证码有效期 20 分钟",
"description": ""
},
- "FOOymB": {
- "defaultMessage": "还没有成员",
- "description": "src/views/Circle/Profile/MembersDialog/Content.tsx"
- },
- "hYG5fb": {
- "defaultMessage": "人追踪",
- "description": "src/views/TagDetail/Followers/index.tsx"
+ "jgLiba": {
+ "defaultMessage": "请输入验证码",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "ANA7sk": {
- "defaultMessage": "主理",
- "description": "src/views/TagDetail/Owner/index.tsx"
+ "jvo0vs": {
+ "defaultMessage": "保存",
+ "description": ""
},
- "4Odb0J": {
- "defaultMessage": "置顶作品",
- "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
+ "k5NnNF": {
+ "defaultMessage": "追踪了你",
+ "description": "src/components/Notice/UserNotice/UserNewFollowerNotice.tsx"
},
- "TQLBox": {
- "defaultMessage": "取消置顶",
- "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
+ "kc79d3": {
+ "defaultMessage": "找你想看的",
+ "description": ""
},
- "ZVoJan": {
- "defaultMessage": "修订作品",
- "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx"
+ "lD4FPZ": {
+ "defaultMessage": "请输入邮箱",
+ "description": ""
},
- "hrgo+E": {
- "defaultMessage": "隐藏",
+ "lIir/P": {
+ "defaultMessage": "我知道了",
"description": ""
},
- "uIdMon": {
- "defaultMessage": "确认隐藏,其他用户将无法从站内访问该作品。隐藏后无法回退,如需再次呈现作品,你需要重新发布。",
- "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
+ "lNjDPr": {
+ "defaultMessage": "你还没有邀请任何用户喔!点击新增邀请,添加站内或站外朋友加入围炉赠与对方免费资格的固定时长",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx"
},
- "oIkacT": {
- "defaultMessage": "作品已隐藏",
- "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
+ "ldNgRA": {
+ "defaultMessage": "Display name, can be changed later",
+ "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
},
- "K3r6DQ": {
- "defaultMessage": "刪除",
+ "lhaIoi": {
+ "defaultMessage": "请输入姓名",
"description": ""
},
- "mikY/9": {
- "defaultMessage": "编辑",
- "description": "src/components/Comment/DropdownActions/EditButton.tsx"
- },
- "50cquj": {
- "defaultMessage": "还没有众聊",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "ll/ufR": {
+ "defaultMessage": "热门",
+ "description": ""
},
- "EW5R4p": {
- "defaultMessage": "催更、提问、分享、讨论…",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "mCAIcg": {
+ "defaultMessage": "站内阅读热门排行",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx"
},
- "9nNpKP": {
- "defaultMessage": "讨论已送出",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "mPe6DK": {
+ "defaultMessage": " 订阅了你的围炉",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "TjWWxF": {
- "defaultMessage": "广播已送出",
- "description": "src/views/Circle/Broadcast/Broadcast.tsx"
+ "mSAY3/": {
+ "defaultMessage": "已取消屏蔽。该用户现在可以评论你的作品和围炉。",
+ "description": "src/components/BlockUser/Button/index.tsx"
},
"mWjpk9": {
"defaultMessage": "还没有广播",
"description": "src/views/Circle/Broadcast/Broadcast.tsx"
},
- "zb8Kx1": {
- "defaultMessage": "公告、提醒、碎碎念…"
+ "mikY/9": {
+ "defaultMessage": "编辑",
+ "description": "src/components/Comment/DropdownActions/EditButton.tsx"
},
- "AGcU5J": {
- "defaultMessage": "置顶",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "mjMpv4": {
+ "defaultMessage": "围炉已更新",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "jJ1Brc": {
- "defaultMessage": "喜欢回应",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "mk+LCk": {
+ "defaultMessage": "界面设定",
+ "description": "src/views/Me/Settings/AnonymousSettings/DisplayPreferences/index.tsx"
},
- "RFzVUD": {
- "defaultMessage": "取消置顶",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "ml3SZN": {
+ "defaultMessage": "至少 8 个字符,支持英文大小写字母、数字和特殊符号",
+ "description": ""
},
- "X+Xvgq": {
- "defaultMessage": "取消精选",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "nGBrvw": {
+ "defaultMessage": "我的收藏",
+ "description": ""
},
- "7xnrxG": {
- "defaultMessage": "作品已添加至精选",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
+ "nYeDrI": {
+ "defaultMessage": "沒有帐户?",
+ "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
},
- "WSUAwk": {
- "defaultMessage": "添加到精选",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
+ "nsaJRn": {
+ "defaultMessage": "上站成功",
+ "description": ""
},
- "Js/Fij": {
- "defaultMessage": "作品已取消精选",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
+ "o2Na0B": {
+ "defaultMessage": "返回全部",
+ "description": ""
},
- "aa0nss": {
- "defaultMessage": "取消精选",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
+ "oIkacT": {
+ "defaultMessage": "作品已隐藏",
+ "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
},
- "32bml8": {
- "defaultMessage": "追踪",
- "description": "src/components/Layout/SideNav/index.tsx"
+ "oNYnCM": {
+ "defaultMessage": "已注销用户",
+ "description": "src/components/UserProfile/index.tsx"
},
"ohgTH4": {
"defaultMessage": "追踪中",
"description": "src/components/UserProfile/index.tsx"
},
- "Cu3Cty": {
- "defaultMessage": "月",
- "description": ""
- },
- "qlki7w": {
- "defaultMessage": "移除作品",
- "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx"
- },
"pRV+UD": {
"defaultMessage": "折叠",
"description": "src/components/Comment/DropdownActions/CollapseComment/Button.tsx"
},
- "h9CG9E": {
- "defaultMessage": "{commentType}已刪除",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
- },
- "Cdkhl8": {
- "defaultMessage": "刪除{commentType}",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
- },
- "77tYPg": {
- "defaultMessage": "确认删除后,{commentType}会立即消失。",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
+ "ptqBN1": {
+ "defaultMessage": "暂时不要",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "cd/II9": {
- "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}",
+ "pwlQEY": {
+ "defaultMessage": "姓名",
"description": ""
},
- "ZAs170": {
- "defaultMessage": "基本资料",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "DMlmcU": {
- "defaultMessage": "免费资格",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "EQeKnO": {
- "defaultMessage": "邀请管理",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "KLQ1/z": {
- "defaultMessage": "围炉创建成功",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "pzTOmv": {
+ "defaultMessage": "追踪者",
+ "description": ""
},
- "mjMpv4": {
- "defaultMessage": "围炉已更新",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "q+N5Wd": {
+ "defaultMessage": "管理围炉",
+ "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
},
- "ei+kyp": {
+ "q9oMKE": {
"defaultMessage": "围炉名称",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "description": ""
},
- "tW3hM/": {
- "defaultMessage": "围炉描述",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qPPrzm": {
+ "defaultMessage": " 支持了你的作品 ",
+ "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
- "CwWLOr": {
- "defaultMessage": "给围炉取一个吸引人的名字吧",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qQmSxu": {
+ "defaultMessage": "你已成功登记参加空投且完成以太坊钱包设定,空投活动将在 2021/11/12 进行。你设定的空投地址:",
+ "description": "src/components/Notice/CryptoNotice/CryptoWalletAirdropNotice.tsx"
},
- "QUqfbW": {
- "defaultMessage": "说说围炉的有趣之处,吸引支持者加入",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qYzBk8": {
+ "defaultMessage": "退订了你的围炉",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "JXdbo8": {
- "defaultMessage": "完成",
- "description": ""
+ "qlki7w": {
+ "defaultMessage": "移除作品",
+ "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx"
},
- "q9oMKE": {
- "defaultMessage": "围炉名称",
+ "qswU4E": {
+ "defaultMessage": "邮箱将不作为登入使用,仅作为联系渠道",
"description": ""
},
- "QZXKhG": {
- "defaultMessage": "设置围炉网址(创建后不可修改)",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
- },
- "6BXcdo": {
- "defaultMessage": "设定围炉门槛(每月)",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
+ "qyzJxi": {
+ "defaultMessage": "航行日志 1.0",
+ "description": "src/components/UserProfile/DropdownActions/index.tsx"
},
- "VwuiYK": {
- "defaultMessage": "Oops!此网址名称已被使用了,换一个试试",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
+ "rBjwQy": {
+ "defaultMessage": "微博",
+ "description": "src/components/Share/Buttons/Weibo.tsx"
},
- "gMZZ9I": {
- "defaultMessage": "2-20 个字符,仅支持英文小写字母、数字或下划线",
+ "rXnmeE": {
+ "defaultMessage": "确认发送",
"description": ""
},
- "+7SAix": {
- "defaultMessage": "2-12 个字符",
- "description": ""
+ "reOeq5": {
+ "defaultMessage": "你已拥有个人创作空间站,期待你的第一篇作品。",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "eov+J2": {
- "defaultMessage": "自定义网址名称",
- "description": ""
+ "rf0ew3": {
+ "defaultMessage": "快来搭建围炉,呼召你的支持者加入!",
+ "description": "src/components/UserProfile/CircleWidget/index.tsx"
},
- "8KFsZN": {
- "defaultMessage": "阅读次数",
+ "rfz/fN": {
+ "defaultMessage": "建议封面尺寸 1600 x 900 像素",
"description": ""
},
- "LOefol": {
- "defaultMessage": "上锁",
- "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
- },
- "/podGX": {
- "defaultMessage": "公开",
- "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
+ "rs0YS2": {
+ "defaultMessage": "已禁言用户",
+ "description": "src/components/UserProfile/index.tsx"
},
- "mCAIcg": {
- "defaultMessage": "站内阅读热门排行",
- "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx"
+ "sPgUkN": {
+ "defaultMessage": "本月营收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "lNjDPr": {
- "defaultMessage": "你还没有邀请任何用户喔!点击新增邀请,添加站内或站外朋友加入围炉赠与对方免费资格的固定时长",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx"
+ "skbUBl": {
+ "defaultMessage": "Log in",
+ "description": "src/components/Buttons/Login/index.tsx"
},
- "RxiHr/": {
- "defaultMessage": "还没有任何用户回覆你的邀请喔!",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
+ "sncOwi": {
+ "defaultMessage": " 在作品中提及你",
+ "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx"
},
- "b8ogKp": {
- "defaultMessage": "新增邀请",
- "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx"
+ "stjoBH": {
+ "defaultMessage": "现在,去为你喜欢的作者打赏吧!你的每一次打赏都将为作者带来收入。",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "FmWYRt": {
- "defaultMessage": "免费资格时长",
+ "sy+pv5": {
+ "defaultMessage": "邮箱",
"description": ""
},
- "Bc20la": {
- "defaultMessage": "天",
- "description": ""
+ "t7ah39": {
+ "defaultMessage": " 成为了标签的主理人,你的作品也在其中。快来看看其他作者的精彩创作吧",
+ "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx"
},
- "O0QB1v": {
- "defaultMessage": "用户将收到你的围炉免费资格邀请函,设置免费的时限,邀请他们一起加入吧!",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
+ "t8/r8X": {
+ "defaultMessage": "连接加密钱包",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "rXnmeE": {
- "defaultMessage": "确认发送",
- "description": ""
+ "tQsujN": {
+ "defaultMessage": " 众聊中回复话题,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "ptqBN1": {
- "defaultMessage": "暂时不要",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
+ "tW3hM/": {
+ "defaultMessage": "围炉描述",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
"tzq2+W": {
"defaultMessage": "寄出邀请",
"description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "fWDtpq": {
- "defaultMessage": "邀请中",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
- },
- "JpS59y": {
- "defaultMessage": "已接受",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
+ "u5aHb4": {
+ "defaultMessage": "复制链接",
+ "description": ""
},
- "Bjdw71": {
- "defaultMessage": "目前总追踪人数",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uIdMon": {
+ "defaultMessage": "确认隐藏,其他用户将无法从站内访问该作品。隐藏后无法回退,如需再次呈现作品,你需要重新发布。",
+ "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
},
- "xWZr13": {
- "defaultMessage": "{follower, plural, =1 {人} other {人}}",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uVCg1l": {
+ "defaultMessage": "玩转 Matters 实用指南",
+ "description": ""
},
- "GugBCe": {
- "defaultMessage": "本月新增追踪人数",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uqmi/b": {
+ "defaultMessage": " 置顶了你在作品 ",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
},
- "MDNaxs": {
- "defaultMessage": "人",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uuEGON": {
+ "defaultMessage": " 众聊中发表与回复话题,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "zKOr2x": {
- "defaultMessage": "已追踪用户占总观看人数比例",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uw32VR": {
+ "defaultMessage": "教学指南",
+ "description": ""
},
- "AYTnjk": {
- "defaultMessage": "追踪",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "v6YjIn": {
+ "defaultMessage": "账户",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "sPgUkN": {
- "defaultMessage": "本月营收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "vAc1Bw": {
+ "defaultMessage": "封锁用户",
+ "description": ""
},
- "Fe682o": {
- "defaultMessage": "下月预期营收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "vH8sCb": {
+ "defaultMessage": "我的围炉",
+ "description": ""
},
- "L4NXXh": {
- "defaultMessage": "目前总营收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "wEQDC6": {
+ "defaultMessage": "编辑资料",
+ "description": ""
},
- "d4waan": {
- "defaultMessage": "营收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "wSEOxH": {
+ "defaultMessage": "联系渠道",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "6OBAOi": {
- "defaultMessage": "目前总订阅人数",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wXzTZ0": {
+ "defaultMessage": "Enter the name of your Circle",
+ "description": ""
},
- "zxy15q": {
- "defaultMessage": "{subscriber, plural, =1 {人} other {人}}",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wbcwKd": {
+ "defaultMessage": "查看全部",
+ "description": ""
},
- "TSDiqB": {
- "defaultMessage": "付费人数",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wqaNK4": {
+ "defaultMessage": "在你的围炉 ",
+ "description": ""
},
- "XHMco9": {
- "defaultMessage": "人",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xGh9O7": {
+ "defaultMessage": "提醒:信箱将不作为登入使用,仅作为联系渠道",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "1qQzV0": {
- "defaultMessage": "免费邀请",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xWZr13": {
+ "defaultMessage": "{follower, plural, =1 {人} other {人}}",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "WpvsPu": {
- "defaultMessage": "订阅",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xiKjd/": {
+ "defaultMessage": "使用电子邮箱",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "SNh1n0": {
- "defaultMessage": "查看名单",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xmcVZ0": {
+ "defaultMessage": "搜索",
+ "description": ""
},
- "2CqWQE": {
- "defaultMessage": "总数",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xwj01D": {
+ "defaultMessage": " 邀请你成为标签的协作者",
+ "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx"
},
"y0b6Kp": {
"defaultMessage": "付费",
"description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "L0J61B": {
- "defaultMessage": "免费",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "y1Z3or": {
+ "defaultMessage": "修改介面语言",
+ "description": ""
},
- "SdXoXI": {
- "defaultMessage": "你已寄出邀请给朋友们,快去已邀请管理查看他们加入的进度吧!",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
+ "ySGgTo": {
+ "defaultMessage": "添加精选",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "OIj8pQ": {
- "defaultMessage": "成功发送邀请",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
+ "yZfKI4": {
+ "defaultMessage": "discussion and mentioned you",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "lIir/P": {
- "defaultMessage": "我知道了",
+ "zKOr2x": {
+ "defaultMessage": "已追踪用户占总观看人数比例",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ },
+ "zQvVDJ": {
+ "defaultMessage": "全部",
"description": ""
},
- "2uwwz+": {
- "defaultMessage": "累计阅读时長代表了你的作品被登入用户阅读的总时数,每次阅读过程超过一定时间后才会计入。此外,同一个用户的多次阅读也会进行累计。",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zb8Kx1": {
+ "defaultMessage": "公告、提醒、碎碎念…"
},
- "Z6cII7": {
- "defaultMessage": "累计阅读时数",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zxlwbc": {
+ "defaultMessage": "等待写入完成...",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "DXJ8ys": {
- "defaultMessage": "阅读次数代表了你的作品被登入用户阅读的总次数,每次阅读过程超过一定时间后才会计入。此外,同一个用户的多次阅读也会进行累计。",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zxy15q": {
+ "defaultMessage": "{subscriber, plural, =1 {人} other {人}}",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
}
}
+
From 83e298cbaecca586b58adb861856816636c3f865 Mon Sep 17 00:00:00 2001
From: Matty <98379126+matters-tech@users.noreply.github.com>
Date: Wed, 12 Apr 2023 17:08:53 +0700
Subject: [PATCH 84/92] New translations default.json (Chinese Traditional)
---
lang/zh-Hant.json | 1793 ++++++++++++++++++++++-----------------------
1 file changed, 873 insertions(+), 920 deletions(-)
diff --git a/lang/zh-Hant.json b/lang/zh-Hant.json
index a000082a9c..773b50877b 100644
--- a/lang/zh-Hant.json
+++ b/lang/zh-Hant.json
@@ -1,1297 +1,1250 @@
{
- "cfL5uk": {
- "defaultMessage": "已超過 200 字,目前 {numbers} 字",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ "+7SAix": {
+ "defaultMessage": "2-12 個字元",
+ "description": ""
},
- "3uQKhx": {
- "defaultMessage": "若你希望向 Matters 提出建議,或遭遇操作異常,请發送郵件至",
- "description": "src/views/Help/index.tsx"
+ "+a+2ug": {
+ "defaultMessage": "成員",
+ "description": ""
+ },
+ "+hfUcV": {
+ "defaultMessage": "在圍爐 {circlename} 發布了新廣播",
+ "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ },
+ "/+XWDi": {
+ "defaultMessage": "航行日誌 2.0",
+ "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ },
+ "/3G89K": {
+ "defaultMessage": " 又成長了",
+ "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ },
+ "/3kw6k": {
+ "defaultMessage": "嘗試將內容寫入 IPFS 網絡中,需要一段時間,請耐心等候。若等候時間過久,可透過發佈文章來加速。",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ },
+ "/IMR+8": {
+ "defaultMessage": "支持排行榜",
+ "description": ""
+ },
+ "/asuIY": {
+ "defaultMessage": "進入社區",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
"/ns2st": {
"defaultMessage": "下載應用",
"description": ""
},
- "FaTb0A": {
- "defaultMessage": "安裝 MetaMask",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "/nu5ho": {
+ "defaultMessage": "回覆了你在作品 ",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "FhWC22": {
- "defaultMessage": "社區共建基地",
- "description": ""
+ "/podGX": {
+ "defaultMessage": "公開",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
},
- "Xd0J7Y": {
- "defaultMessage": "開放社區",
+ "0Azlrb": {
+ "defaultMessage": "管理",
"description": ""
},
- "dnsfmR": {
- "defaultMessage": ",我們會儘快回覆!",
- "description": "src/views/Help/index.tsx"
- },
- "ZjDH42": {
- "defaultMessage": "關於我們",
+ "1EYCdR": {
+ "defaultMessage": "標籤",
"description": ""
},
- "6flWFg": {
- "defaultMessage": "用戶協議",
+ "1pFLGZ": {
+ "defaultMessage": "漏洞賞金計畫",
"description": ""
},
- "uVCg1l": {
- "defaultMessage": "玩轉 Matters 實用指南",
+ "1qQzV0": {
+ "defaultMessage": "免費邀請",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ },
+ "20bImY": {
+ "defaultMessage": "眾聊",
"description": ""
},
- "HzaRKA": {
- "defaultMessage": "一鍵搬家",
+ "2CqWQE": {
+ "defaultMessage": "總數",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ },
+ "2atspc": {
+ "defaultMessage": "我的草稿",
"description": ""
},
- "fOgusL": {
- "defaultMessage": "選擇進入方式",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "2eebTb": {
+ "defaultMessage": " 收藏了你的作品",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
},
- "t8/r8X": {
- "defaultMessage": "連接加密錢包",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "2slIPX": {
+ "defaultMessage": "我的讚賞",
+ "description": ""
},
- "iCFXtS": {
- "defaultMessage": "歡迎未註冊或已啟用錢包登入的朋友使用",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "2uRduT": {
+ "defaultMessage": " 的評論",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
},
- "xiKjd/": {
- "defaultMessage": "使用電子信箱",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "2uwwz+": {
+ "defaultMessage": "累計閱讀時數代表了你的作品被登入用戶閱讀的總時數,每次閱讀過程超過一定時間後才會計入。此外,同一個用戶的多次閱讀也會進行累計。",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
},
- "J+LXrH": {
- "defaultMessage": "持續提供信箱進入,未來可隨時啟用錢包登入",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "32bml8": {
+ "defaultMessage": "追蹤",
+ "description": "src/components/Layout/SideNav/index.tsx"
},
- "XcTMMM": {
- "defaultMessage": "已有帳戶?",
- "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
+ "3KNMbJ": {
+ "defaultMessage": "作品",
+ "description": ""
},
- "ipQlDG": {
- "defaultMessage": "以郵箱登入",
- "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
+ "3WKlPP": {
+ "defaultMessage": "commented in",
+ "description": ""
},
- "pwlQEY": {
- "defaultMessage": "姓名",
+ "3kbIhS": {
+ "defaultMessage": "未命名",
"description": ""
},
- "4mbdyI": {
- "defaultMessage": "電子信箱",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "3uQKhx": {
+ "defaultMessage": "若你希望向 Matters 提出建議,或遭遇操作異常,请發送郵件至",
+ "description": "src/views/Help/index.tsx"
},
- "0Rw3H/": {
- "defaultMessage": "我已閱讀並同意",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "3yk8fB": {
+ "defaultMessage": "我的錢包",
+ "description": ""
},
- "LphWYP": {
- "defaultMessage": "Matters 用戶協議和隱私政策",
+ "3ynsJ3": {
+ "defaultMessage": "想了解更多?詳見 ",
+ "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ },
+ "47FYwb": {
+ "defaultMessage": "取消",
"description": ""
},
- "agfumL": {
- "defaultMessage": "下一步",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "4Odb0J": {
+ "defaultMessage": "置頂作品",
+ "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
},
- "l5vWO8": {
- "defaultMessage": "你的站內暱稱,之後可以修改",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "4giHJT": {
+ "defaultMessage": "在行動裝置上使用問題,參考 ",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "5sg7KC": {
- "defaultMessage": "密碼",
+ "4vkwo0": {
+ "defaultMessage": "你的修訂作品已發布到分佈式網絡",
+ "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx"
+ },
+ "50cquj": {
+ "defaultMessage": "還沒有眾聊",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
+ },
+ "5FO4vn": {
+ "defaultMessage": "你尚無權限進行該操作",
"description": ""
},
- "ml3SZN": {
- "defaultMessage": "至少 8 個字元,支持英文大小寫字母、數字和特殊符號",
+ "5sAbzJ": {
+ "defaultMessage": " 眾聊中發表話題 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ },
+ "5sg7KC": {
+ "defaultMessage": "密碼",
"description": ""
},
- "NzfL1d": {
- "defaultMessage": "再次輸入密碼",
- "description": "src/components/Forms/EmailSignUpForm/Password.tsx"
+ "63HuBz": {
+ "defaultMessage": "此標籤目前無人主理",
+ "description": "src/views/TagDetail/Owner/index.tsx"
},
- "N2IrpM": {
- "defaultMessage": "確認",
+ "69+D96": {
+ "defaultMessage": "開始創作",
"description": ""
},
- "XH0Lb6": {
- "defaultMessage": "歡迎加入 Matters!",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "6BXcdo": {
+ "defaultMessage": "設定圍爐門檻(每月)",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
- "stjoBH": {
- "defaultMessage": "現在,去為你喜歡的作者打賞吧!你的每一次打賞都將為作者帶來收入。",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "6OBAOi": {
+ "defaultMessage": "目前總訂閱人數",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "reOeq5": {
- "defaultMessage": "你已擁有個人創作空間站,期待你的第一篇作品。",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "6flWFg": {
+ "defaultMessage": "用戶協議",
+ "description": ""
},
- "ANhCde": {
- "defaultMessage": "馬上開始你的創作吧!",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "77tYPg": {
+ "defaultMessage": "確認刪除後,{commentType}會立即消失。",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "/asuIY": {
- "defaultMessage": "進入社區",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "7DIW6+": {
+ "defaultMessage": "暸解更多",
+ "description": ""
},
- "nsaJRn": {
- "defaultMessage": "登入成功",
+ "7xnrxG": {
+ "defaultMessage": "作品已添加至精選",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
+ },
+ "8KFsZN": {
+ "defaultMessage": "閱讀次數",
"description": ""
},
- "lD4FPZ": {
- "defaultMessage": "請輸入電子信箱",
+ "8cv9D4": {
+ "defaultMessage": "Next Step",
"description": ""
},
- "IFY8r4": {
- "defaultMessage": "請輸入密碼",
- "description": "src/components/Forms/EmailLoginForm/index.tsx"
+ "8xPi0N": {
+ "defaultMessage": "離開圍爐",
+ "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
},
- "z+209N": {
- "defaultMessage": "註冊",
+ "9+Ddtu": {
+ "defaultMessage": "下一步",
"description": ""
},
- "nYeDrI": {
- "defaultMessage": "沒有帳戶?",
- "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
+ "9nNpKP": {
+ "defaultMessage": "討論已送出",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
},
- "xGh9O7": {
- "defaultMessage": "提醒:信箱將不作為登入使用,僅作為聯繫渠道",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A3LOng": {
+ "defaultMessage": " 眾聊中回覆話題 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "N3K1H9": {
- "defaultMessage": "Matters 不會透過任何渠道詢問你的錢包私鑰。",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A3rLZt": {
+ "defaultMessage": "最近 {months} 個月",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "hWs95P": {
- "defaultMessage": "重要訊息將透過郵件通知,請填入信箱完成設定。",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A3wDZ8": {
+ "defaultMessage": "我的 NFT 收藏",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
},
- "cg1VJ2": {
- "defaultMessage": "連接加密錢包",
+ "A41QIy": {
+ "defaultMessage": "Enter Password",
"description": ""
},
- "YjNkcK": {
- "defaultMessage": "若要變更地址,請直接操作錢包切換",
- "description": ""
- },
- "wSEOxH": {
- "defaultMessage": "聯繫渠道",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "CwSpld": {
- "defaultMessage": "非登入用途",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "qswU4E": {
- "defaultMessage": "信箱將不作為登入使用,僅作為聯繫渠道",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "EfJYPI": {
- "defaultMessage": "驗證碼",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "jgLiba": {
- "defaultMessage": "請輸入驗證碼",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "jL2ZHb": {
- "defaultMessage": "驗證碼有效期 20 分鐘",
+ "A7ugfn": {
+ "defaultMessage": "更多操作",
"description": ""
},
- "4giHJT": {
- "defaultMessage": "在行動裝置上使用問題,參考 ",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
- },
- "uw32VR": {
- "defaultMessage": "教學指南",
+ "A8MpFX": {
+ "defaultMessage": "請輸入個人簡介",
"description": ""
},
- "hrfF+i": {
- "defaultMessage": "剛接觸加密錢包?參考 ",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
- },
- "HxcjQl": {
- "defaultMessage": "Matters 將提供更多創作與區塊鏈結合的服務,接入錢包後即可在未來第一時間體驗新功能。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "AGcU5J": {
+ "defaultMessage": "置頂",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "LqxIEU": {
- "defaultMessage": "錢包地址將作為身份識別之一在個人頁公開顯示。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "ANA7sk": {
+ "defaultMessage": "主理",
+ "description": "src/views/TagDetail/Owner/index.tsx"
},
- "UOdEqi": {
- "defaultMessage": "原有透過電子信箱登入方式將為你保留。為維護你的帳戶安全,加密錢包連接後無法重設。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "ANhCde": {
+ "defaultMessage": "馬上開始你的創作吧!",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "VrOoVf": {
- "defaultMessage": "Matters 不會透過任何渠道主動詢問你的錢包私鑰。",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "AYTnjk": {
+ "defaultMessage": "追蹤",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "v6YjIn": {
- "defaultMessage": "帳戶",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "BHFHeY": {
+ "defaultMessage": " 在圍爐 {commentCircle}",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "H8KGyc": {
- "defaultMessage": "進入",
+ "Bc20la": {
+ "defaultMessage": "天",
"description": ""
},
- "sy+pv5": {
- "defaultMessage": "電子郵箱",
- "description": ""
+ "Bjdw71": {
+ "defaultMessage": "目前總追蹤人數",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "JxlxVc": {
- "defaultMessage": "忘記密碼?",
- "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
+ "BjzRe8": {
+ "defaultMessage": ",快去查看自己的收入吧!",
+ "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
- "deEeEI": {
- "defaultMessage": "註冊",
+ "CBDDR5": {
+ "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
"description": ""
},
- "EwVnoC": {
- "defaultMessage": "我已閱讀並同意",
- "description": ""
+ "Cdkhl8": {
+ "defaultMessage": "刪除{commentType}",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "9+Ddtu": {
- "defaultMessage": "下一步",
+ "CnPG8j": {
+ "defaultMessage": "精華",
"description": ""
},
- "k5NnNF": {
- "defaultMessage": "追蹤了你",
- "description": "src/components/Notice/UserNotice/UserNewFollowerNotice.tsx"
- },
- "KZlRde": {
- "defaultMessage": " 關聯了你的作品 ",
- "description": "src/components/Notice/ArticleArticleNotice/ArticleNewCollectedNotice.tsx"
- },
- "/nu5ho": {
- "defaultMessage": "回覆了你在作品 ",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "ZUPQzl": {
- "defaultMessage": " 的評論",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "b+LSgI": {
- "defaultMessage": "回覆了你在圍爐 ",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "aaUBvF": {
- "defaultMessage": " 中的發言",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "DIQKiC": {
- "defaultMessage": " 在作品 ",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "jqACL/": {
- "defaultMessage": " 的評論中提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "+AdTsY": {
- "defaultMessage": " 眾聊提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "Cu3Cty": {
+ "defaultMessage": "月",
+ "description": ""
},
- "ISn3eZ": {
- "defaultMessage": " 廣播提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "CwSpld": {
+ "defaultMessage": "非登入用途",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "uqmi/b": {
- "defaultMessage": " 置頂了你在作品 ",
- "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ "D2Sw/t": {
+ "defaultMessage": "添加以下任一網址到 RSS 閱讀器",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "VjxGd7": {
- "defaultMessage": "評論了作品 ",
- "description": "src/components/Notice/CommentNotice/ArticleNewCommentNotice.tsx"
+ "D3idYv": {
+ "defaultMessage": "設定",
+ "description": ""
},
- "U/Tqmx": {
- "defaultMessage": "評論了你收藏的作品 ",
- "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx"
+ "DMlmcU": {
+ "defaultMessage": "免費資格",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "VoOZni": {
- "defaultMessage": "在圍爐 ",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ "DXJ8ys": {
+ "defaultMessage": "閱讀次數代表了你的作品被登入用戶閱讀的總次數,每次閱讀過程超過一定時間後才會計入。此外,同一個用戶的多次閱讀也會進行累計。",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
},
- "oaDToH": {
- "defaultMessage": " 發布了新廣播",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ "E8W3qa": {
+ "defaultMessage": "2-20 個字元",
+ "description": ""
},
- "qPPrzm": {
- "defaultMessage": " 支持了你的作品 ",
- "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
+ "EQeKnO": {
+ "defaultMessage": "邀請管理",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "BjzRe8": {
- "defaultMessage": ",快去查看自己的收入吧!",
- "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
+ "EW5R4p": {
+ "defaultMessage": "催更、提問、分享、討論…",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
},
- "z4NaU2": {
- "defaultMessage": "你的 ",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
+ "EfJYPI": {
+ "defaultMessage": "驗證碼",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "bVZDVx": {
- "defaultMessage": "提現流程已開始,到帳時間請關注銀行提醒。",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
+ "EoNvLu": {
+ "defaultMessage": "創作了",
+ "description": "src/views/User/Articles/UserArticles.tsx"
},
- "nto8ly": {
- "defaultMessage": "訂閱了你的圍爐",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "EwVnoC": {
+ "defaultMessage": "我已閱讀並同意",
+ "description": ""
},
- "qYzBk8": {
- "defaultMessage": "退訂了你的圍爐",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "FALWef": {
+ "defaultMessage": " 廣播中留言 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
},
- "LW1aX1": {
- "defaultMessage": "恭喜你!",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "FOOymB": {
+ "defaultMessage": "還沒有成員",
+ "description": "src/views/Circle/Profile/MembersDialog/Content.tsx"
},
- "KyWDUu": {
- "defaultMessage": " 邀請你免費加入圍爐 ",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "FaTb0A": {
+ "defaultMessage": "安裝 MetaMask",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "jF+Mle": {
- "defaultMessage": " 天,前去免費體驗,與大家談天說地吧。",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "Fe682o": {
+ "defaultMessage": "下月預期營收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "wqaNK4": {
- "defaultMessage": "在你的圍爐 ",
+ "FhWC22": {
+ "defaultMessage": "社區共建基地",
"description": ""
},
- "FALWef": {
- "defaultMessage": " 廣播中留言 ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
+ "FmWYRt": {
+ "defaultMessage": "免費資格時長",
+ "description": ""
},
- "YlxpJl": {
- "defaultMessage": " 廣播中留言,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
+ "GBm/sD": {
+ "defaultMessage": " 眾聊中發表話題,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "qQmSxu": {
- "defaultMessage": "你已成功登記參加空投且完成以太坊錢包設定,空投活動將在 2021/11/12 進行。你設定的空投地址:",
- "description": "src/components/Notice/CryptoNotice/CryptoWalletAirdropNotice.tsx"
+ "GRtGnZ": {
+ "defaultMessage": "辭去權限",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "UgvfcU": {
- "defaultMessage": "你已完成以太坊錢包設定。你設定的地址:",
- "description": "src/components/Notice/CryptoNotice/CryptoWalletConnectedNotice.tsx"
+ "GZJpDf": {
+ "defaultMessage": "數據後台",
+ "description": ""
},
- "+hfUcV": {
- "defaultMessage": "在圍爐 {circlename} 發布了新廣播",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ "GugBCe": {
+ "defaultMessage": "本月新增追蹤人數",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "An0rpe": {
- "defaultMessage": " {circlename} 廣播中留言 ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
+ "H0JBH6": {
+ "defaultMessage": "登出",
+ "description": ""
},
- "VO4Elt": {
- "defaultMessage": " 在作品 {commentArticle} 的評論中提及你",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "H8KGyc": {
+ "defaultMessage": "進入",
+ "description": ""
},
- "BHFHeY": {
- "defaultMessage": " 在圍爐 {commentCircle}",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "HFVDeB": {
+ "defaultMessage": "相關標籤",
+ "description": "src/views/TagDetail/RelatedTags/index.tsx"
},
- "5sAbzJ": {
- "defaultMessage": " 眾聊中發表話題 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "HtSDyc": {
+ "defaultMessage": "幫助中心",
+ "description": ""
},
- "A3LOng": {
- "defaultMessage": " 眾聊中回覆話題 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "HxcjQl": {
+ "defaultMessage": "Matters 將提供更多創作與區塊鏈結合的服務,接入錢包後即可在未來第一時間體驗新功能。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "ftD7Hy": {
- "defaultMessage": " 眾聊提及了你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "HzaRKA": {
+ "defaultMessage": "一鍵搬家",
+ "description": ""
},
- "g/L3Fm": {
- "defaultMessage": " 眾聊中發表與回覆話題 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "IFY8r4": {
+ "defaultMessage": "請輸入密碼",
+ "description": "src/components/Forms/EmailLoginForm/index.tsx"
},
- "GBm/sD": {
- "defaultMessage": " 眾聊中發表話題,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "Ic4hqD": {
+ "defaultMessage": "字",
+ "description": "src/views/User/Articles/UserArticles.tsx"
},
- "tQsujN": {
- "defaultMessage": " 眾聊中回覆話題,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "J+LXrH": {
+ "defaultMessage": "持續提供信箱進入,未來可隨時啟用錢包登入",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "uuEGON": {
- "defaultMessage": " 眾聊中發表與回覆話題,其中有提及你 ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "J+dIsA": {
+ "defaultMessage": "訂閱",
+ "description": ""
},
"J3yk6u": {
"defaultMessage": "在圍爐 ",
"description": ""
},
- "hk2aiz": {
- "defaultMessage": " 追蹤了你的圍爐",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
- },
- "mPe6DK": {
- "defaultMessage": " 訂閱了你的圍爐",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
- },
"JIjMWL": {
"defaultMessage": "你的作品已發布到分佈式網絡",
"description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx"
},
- "sncOwi": {
- "defaultMessage": " 在作品中提及你",
- "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx"
+ "JXdbo8": {
+ "defaultMessage": "完成",
+ "description": ""
},
- "2eebTb": {
- "defaultMessage": " 收藏了你的作品",
- "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ "Jc+W6M": {
+ "defaultMessage": " 辭去了標籤主理人權限,你要不要試試看成為新的主理人?",
+ "description": "src/components/Notice/TagNotice/TagLeaveNotice.tsx"
},
- "YIes/F": {
- "defaultMessage": "等 {actorsCount} 人",
- "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ "JpS59y": {
+ "defaultMessage": "已接受",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
},
- "PjT72J": {
- "defaultMessage": "喜歡並讚賞了你的作品",
- "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx"
+ "Js/Fij": {
+ "defaultMessage": "作品已取消精選",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
},
- "4vkwo0": {
- "defaultMessage": "你的修訂作品已發布到分佈式網絡",
- "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx"
+ "JxlxVc": {
+ "defaultMessage": "忘記密碼?",
+ "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
},
- "QV19cI": {
- "defaultMessage": "你的修訂作品發布失敗",
- "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx"
+ "K3r6DQ": {
+ "defaultMessage": "刪除",
+ "description": ""
},
- "euNJsE": {
- "defaultMessage": "新作品已經加入圍爐,馬上前往閱讀吧!",
- "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ "KL502d": {
+ "defaultMessage": "資料已保存",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
},
- "/3G89K": {
- "defaultMessage": " 又成長了",
- "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ "KLQ1/z": {
+ "defaultMessage": "圍爐創建成功",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "xwj01D": {
- "defaultMessage": " 邀請你成為標籤的協作者",
- "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx"
+ "KMcrz8": {
+ "defaultMessage": "認領",
+ "description": "src/views/TagDetail/Owner/index.tsx"
},
- "t7ah39": {
- "defaultMessage": " 成為了標籤的主理人,你的作品也在其中。快來看看其他作者的精彩創作吧",
- "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx"
+ "KZlRde": {
+ "defaultMessage": " 關聯了你的作品 ",
+ "description": "src/components/Notice/ArticleArticleNotice/ArticleNewCollectedNotice.tsx"
},
- "O03Rkc": {
- "defaultMessage": " 辭去了權限。你可以邀請新的協作者加入了",
- "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
+ "KyWDUu": {
+ "defaultMessage": " 邀請你免費加入圍爐 ",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "dsBCfK": {
- "defaultMessage": "哎呀,標籤協作者",
- "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
+ "L0J61B": {
+ "defaultMessage": "免費",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "Jc+W6M": {
- "defaultMessage": " 辭去了標籤主理人權限,你要不要試試看成為新的主理人?",
- "description": "src/components/Notice/TagNotice/TagLeaveNotice.tsx"
+ "L4NXXh": {
+ "defaultMessage": "目前總營收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "OKhRC6": {
- "defaultMessage": "分享",
- "description": ""
+ "L7Si5/": {
+ "defaultMessage": "管理社群",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "u5aHb4": {
- "defaultMessage": "複製鏈接",
+ "LGox1K": {
+ "defaultMessage": "已追蹤",
"description": ""
},
- "NONfAh": {
- "defaultMessage": "豆瓣",
- "description": "src/components/Share/Buttons/Douban.tsx"
+ "LOefol": {
+ "defaultMessage": "上鎖",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
},
- "rBjwQy": {
- "defaultMessage": "微博",
- "description": "src/components/Share/Buttons/Weibo.tsx"
+ "LW1aX1": {
+ "defaultMessage": "恭喜你!",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "bBYO6x": {
- "defaultMessage": "取消封鎖k",
- "description": "src/components/BlockUser/Button/index.tsx"
+ "Lc/azT": {
+ "defaultMessage": "IPNS 訂閱",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "vAc1Bw": {
- "defaultMessage": "封鎖用戶",
+ "LphWYP": {
+ "defaultMessage": "Matters 用戶協議和隱私政策",
"description": ""
},
- "mSAY3/": {
- "defaultMessage": "已取消封鎖。該用戶現在可以評論你的作品和圍爐。",
- "description": "src/components/BlockUser/Button/index.tsx"
+ "LqxIEU": {
+ "defaultMessage": "錢包地址將作為身份識別之一在個人頁公開顯示。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "/+XWDi": {
- "defaultMessage": "航行日誌 2.0",
- "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ "MDNaxs": {
+ "defaultMessage": "人",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "qyzJxi": {
- "defaultMessage": "航行日誌 1.0",
- "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ "MkwOFW": {
+ "defaultMessage": "瀏覽紀錄",
+ "description": ""
},
- "A7ugfn": {
- "defaultMessage": "更多操作",
+ "N2IrpM": {
+ "defaultMessage": "確認",
+ "description": ""
+ },
+ "N3K1H9": {
+ "defaultMessage": "Matters 不會透過任何渠道詢問你的錢包私鑰。",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ },
+ "NAidKb": {
+ "defaultMessage": "通知",
"description": ""
},
- "b1FfGy": {
- "defaultMessage": "内容訂閱",
- "description": "src/components/UserProfile/index.tsx"
+ "NONfAh": {
+ "defaultMessage": "豆瓣",
+ "description": "src/components/Share/Buttons/Douban.tsx"
},
- "/3kw6k": {
- "defaultMessage": "嘗試將內容寫入 IPFS 網絡中,需要一段時間,請耐心等候。若等候時間過久,可透過發佈文章來加速。",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "NzfL1d": {
+ "defaultMessage": "再次輸入密碼",
+ "description": "src/components/Forms/EmailSignUpForm/Password.tsx"
},
- "Lc/azT": {
- "defaultMessage": "IPNS 訂閱",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "O03Rkc": {
+ "defaultMessage": " 辭去了權限。你可以邀請新的協作者加入了",
+ "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
},
- "cf37Zy": {
- "defaultMessage": "添加 IPFS 生成的 IPNS 指紋到閱讀器,如:",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "O0QB1v": {
+ "defaultMessage": "用戶將收到你的圍爐免費資格邀請函,設置免費的時限,邀請他們一起加入吧!",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "zxlwbc": {
- "defaultMessage": "等候寫入完成...",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "OIj8pQ": {
+ "defaultMessage": "成功發送邀請",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
},
- "gMZfHO": {
- "defaultMessage": "RSS 訂閱",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "OKhRC6": {
+ "defaultMessage": "分享",
+ "description": ""
},
- "D2Sw/t": {
- "defaultMessage": "添加以下任一網址到 RSS 閱讀器",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "PjT72J": {
+ "defaultMessage": "喜歡並讚賞了你的作品",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx"
},
- "rf0ew3": {
- "defaultMessage": "快來搭建圍爐,呼召你的支持者加入",
- "description": "src/components/UserProfile/CircleWidget/index.tsx"
+ "Po+kJe": {
+ "defaultMessage": "最近 {month} 個月",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "pzTOmv": {
- "defaultMessage": "追蹤者",
+ "Pp/0po": {
+ "defaultMessage": "換一批",
"description": ""
},
- "i/4KO2": {
- "defaultMessage": "此帳戶因為違反社區約章而被註銷",
- "description": "src/components/UserProfile/index.tsx"
+ "Q8Qw5B": {
+ "defaultMessage": "個人簡介",
+ "description": ""
},
- "oNYnCM": {
- "defaultMessage": "已註銷用戶",
- "description": "src/components/UserProfile/index.tsx"
+ "QCo7Gc": {
+ "defaultMessage": "選擇 NFT 作為你的頭像",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
},
- "rs0YS2": {
- "defaultMessage": "已禁言用戶",
- "description": "src/components/UserProfile/index.tsx"
+ "QUqfbW": {
+ "defaultMessage": "說說圍爐的有趣之處,吸引支持者加入",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "EoNvLu": {
- "defaultMessage": "創作了",
- "description": "src/views/User/Articles/UserArticles.tsx"
+ "QV19cI": {
+ "defaultMessage": "你的修訂作品發布失敗",
+ "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx"
},
- "UxfPXa": {
- "defaultMessage": "累積創作",
- "description": "src/views/User/Articles/UserArticles.tsx"
+ "QZXKhG": {
+ "defaultMessage": "設置圍爐網址(創建後不可修改)",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
- "Ic4hqD": {
- "defaultMessage": "字",
- "description": "src/views/User/Articles/UserArticles.tsx"
+ "RFzVUD": {
+ "defaultMessage": "取消置頂",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "J+dIsA": {
- "defaultMessage": "訂閱",
- "description": ""
+ "RxiHr/": {
+ "defaultMessage": "還沒有任何用戶回覆你的邀請喔!",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
},
- "WBVVYd": {
- "defaultMessage": "回應",
+ "SENRqu": {
+ "defaultMessage": "Help",
"description": ""
},
- "1EYCdR": {
- "defaultMessage": "標籤",
- "description": ""
+ "SNh1n0": {
+ "defaultMessage": "查看名單",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "sT9HoG": {
- "defaultMessage": "歡迎加入 Matters,一個自由、自主、永續的創作與公共討論空間。",
- "description": "src/views/Follow/PickAuthors/index.tsx"
+ "SdXoXI": {
+ "defaultMessage": "你已寄出邀請給朋友們,快去已邀請管理查看他們加入的進度吧!",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
},
- "7DIW6+": {
- "defaultMessage": "暸解更多",
+ "Seanpx": {
+ "defaultMessage": "Required",
"description": ""
},
- "Z6ewE3": {
- "defaultMessage": "參與開發",
- "description": "src/views/Me/Settings/AnonymousSettings/Enhance/index.tsx"
- },
- "1pFLGZ": {
- "defaultMessage": "漏洞賞金計畫",
+ "Szd1tH": {
+ "defaultMessage": "登出失敗,請重試",
"description": ""
},
- "mk+LCk": {
- "defaultMessage": "介面設定",
- "description": "src/views/Me/Settings/AnonymousSettings/DisplayPreferences/index.tsx"
+ "TQLBox": {
+ "defaultMessage": "取消置頂",
+ "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
},
- "y1Z3or": {
- "defaultMessage": "修改界面語言",
- "description": ""
+ "TSDiqB": {
+ "defaultMessage": "付費人數",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "itPgxd": {
- "defaultMessage": "個人主頁",
- "description": ""
+ "TjWWxF": {
+ "defaultMessage": "廣播已送出",
+ "description": "src/views/Circle/Broadcast/Broadcast.tsx"
},
- "vH8sCb": {
- "defaultMessage": "我的圍爐",
+ "TzhzIH": {
+ "defaultMessage": "創作者",
"description": ""
},
- "2atspc": {
- "defaultMessage": "我的草稿",
- "description": ""
+ "U/Tqmx": {
+ "defaultMessage": "評論了你收藏的作品 ",
+ "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx"
},
- "3yk8fB": {
- "defaultMessage": "我的錢包",
- "description": ""
+ "U9IXic": {
+ "defaultMessage": "添加作品",
+ "description": "src/views/Circle/Profile/AddCircleArticle/Button.tsx"
},
- "GZJpDf": {
- "defaultMessage": "數據後台",
+ "UNUROl": {
+ "defaultMessage": "建議 50 字以內,最長 200 字",
"description": ""
},
- "nGBrvw": {
- "defaultMessage": "我的收藏",
- "description": ""
+ "UOdEqi": {
+ "defaultMessage": "原有透過電子信箱登入方式將為你保留。為維護你的帳戶安全,加密錢包連接後無法重設。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "2slIPX": {
- "defaultMessage": "我的讚賞",
- "description": ""
+ "UgvfcU": {
+ "defaultMessage": "你已完成以太坊錢包設定。你設定的地址:",
+ "description": "src/components/Notice/CryptoNotice/CryptoWalletConnectedNotice.tsx"
},
- "2uRduT": {
- "defaultMessage": " 的評論",
- "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ "UjKkhq": {
+ "defaultMessage": "作品已添加標籤",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "MkwOFW": {
- "defaultMessage": "瀏覽紀錄",
- "description": ""
+ "UxfPXa": {
+ "defaultMessage": "累積創作",
+ "description": "src/views/User/Articles/UserArticles.tsx"
},
- "fG41Ux": {
- "defaultMessage": "登出成功",
- "description": ""
+ "VO4Elt": {
+ "defaultMessage": " 在作品 {commentArticle} 的評論中提及你",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "Szd1tH": {
- "defaultMessage": "登出失敗,請重試",
- "description": ""
+ "VjxGd7": {
+ "defaultMessage": "評論了作品 ",
+ "description": "src/components/Notice/CommentNotice/ArticleNewCommentNotice.tsx"
},
- "HtSDyc": {
- "defaultMessage": "幫助中心",
- "description": ""
+ "VrOoVf": {
+ "defaultMessage": "Matters 不會透過任何渠道主動詢問你的錢包私鑰。",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "D3idYv": {
- "defaultMessage": "設定",
- "description": ""
+ "VwuiYK": {
+ "defaultMessage": "Oops!此網址已被使用了,換一個試試",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
- "H0JBH6": {
- "defaultMessage": "登出",
+ "WBVVYd": {
+ "defaultMessage": "回應",
"description": ""
},
- "cE4Hfw": {
- "defaultMessage": "發現",
- "description": ""
+ "WSUAwk": {
+ "defaultMessage": "添加到精選",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
},
- "NAidKb": {
- "defaultMessage": "通知",
- "description": ""
+ "WpvsPu": {
+ "defaultMessage": "訂閱",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "enMIYK": {
- "defaultMessage": "我的",
- "description": ""
+ "WuvE8X": {
+ "defaultMessage": "{circleName} 的追蹤者",
+ "description": "src/views/Circle/Profile/FollowersDialog/index.tsx"
},
- "xmcVZ0": {
- "defaultMessage": "搜尋",
- "description": ""
+ "X+Xvgq": {
+ "defaultMessage": "取消精選",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "47FYwb": {
- "defaultMessage": "取消",
- "description": ""
+ "XH0Lb6": {
+ "defaultMessage": "歡迎加入 Matters!",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "ll/ufR": {
- "defaultMessage": "熱門",
- "description": ""
+ "XHMco9": {
+ "defaultMessage": "人",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "adThp5": {
- "defaultMessage": "最新",
+ "XVYrS/": {
+ "defaultMessage": "還沒有追蹤者",
"description": ""
},
- "CnPG8j": {
- "defaultMessage": "精華",
- "description": ""
+ "XcTMMM": {
+ "defaultMessage": "已有帳戶?",
+ "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
},
- "wbcwKd": {
- "defaultMessage": "查看全部",
+ "Xd0J7Y": {
+ "defaultMessage": "開放社區",
"description": ""
},
"XgdZSb": {
"defaultMessage": "值得關注",
"description": ""
},
- "kc79d3": {
- "defaultMessage": "找你想看的",
- "description": ""
+ "Xz/AHp": {
+ "defaultMessage": "broadcast and mentioned you",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "Pp/0po": {
- "defaultMessage": "換一批",
+ "YIes/F": {
+ "defaultMessage": "等 {actorsCount} 人",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ },
+ "YjNkcK": {
+ "defaultMessage": "若要變更地址,請直接操作錢包切換",
"description": ""
},
- "6gOpfl": {
- "defaultMessage": "暫時隱藏公告欄 7 天",
- "description": "src/views/Home/Announcements/index.tsx"
+ "YlxpJl": {
+ "defaultMessage": " 廣播中留言,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
},
- "3kbIhS": {
- "defaultMessage": "未命名",
- "description": ""
+ "Z6cII7": {
+ "defaultMessage": "累計閱讀時數",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
},
- "MW9PzQ": {
- "defaultMessage": "支持排行榜",
- "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ "Z6ewE3": {
+ "defaultMessage": "參與開發",
+ "description": "src/views/Me/Settings/AnonymousSettings/Enhance/index.tsx"
},
- "cmtHjM": {
- "defaultMessage": "由於你尚未發布任何作品,這裡還沒有任何數據能與你分享哦!發布第一篇作品來介紹你自己,以此開啟你的創作之旅吧!",
- "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ "ZAs170": {
+ "defaultMessage": "基本資料",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "69+D96": {
- "defaultMessage": "開始創作",
- "description": ""
+ "ZUPQzl": {
+ "defaultMessage": " 的評論",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "3ynsJ3": {
- "defaultMessage": "想了解更多?詳見 ",
- "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ "ZVoJan": {
+ "defaultMessage": "修訂作品",
+ "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx"
},
- "0Azlrb": {
- "defaultMessage": "管理",
+ "ZjDH42": {
+ "defaultMessage": "關於我們",
"description": ""
},
- "eXDZGQ": {
- "defaultMessage": "主理人",
- "description": ""
+ "aa0nss": {
+ "defaultMessage": "取消精選",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
},
- "dg3JCQ": {
- "defaultMessage": "協作者",
- "description": ""
+ "aaUBvF": {
+ "defaultMessage": " 中的發言",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "TzhzIH": {
- "defaultMessage": "創作者",
+ "adThp5": {
+ "defaultMessage": "最新",
"description": ""
},
- "Pdx3j1": {
- "defaultMessage": "創作新的作品",
- "description": "src/views/TagDetail/Buttons/AddButton/CreateDraftMenuItem/index.tsx"
+ "b+LSgI": {
+ "defaultMessage": "回覆了你在圍爐 ",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "5FO4vn": {
- "defaultMessage": "你尚無權限進行該操作",
- "description": ""
+ "b1FfGy": {
+ "defaultMessage": "内容訂閱",
+ "description": "src/components/UserProfile/index.tsx"
},
- "8ttGfR": {
- "defaultMessage": "添加我的作品",
- "description": "src/views/TagDetail/Buttons/AddButton/AddMyArticlesButton/index.tsx"
+ "b3onWZ": {
+ "defaultMessage": "最近 {days} 天",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "ieGrWo": {
- "defaultMessage": "追蹤",
- "description": ""
+ "b8ogKp": {
+ "defaultMessage": "新增邀請",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx"
},
- "izWS4J": {
- "defaultMessage": "取消追蹤",
+ "bBYO6x": {
+ "defaultMessage": "取消封鎖k",
+ "description": "src/components/BlockUser/Button/index.tsx"
+ },
+ "beLe/F": {
+ "defaultMessage": "廣播",
"description": ""
},
- "LGox1K": {
- "defaultMessage": "已追蹤",
+ "cE4Hfw": {
+ "defaultMessage": "發現",
"description": ""
},
- "ikVIu3": {
- "defaultMessage": "篇作品",
+ "cd/II9": {
+ "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}",
"description": ""
},
- "HFVDeB": {
- "defaultMessage": "相關標籤",
- "description": "src/views/TagDetail/RelatedTags/index.tsx"
+ "cf37Zy": {
+ "defaultMessage": "添加 IPFS 生成的 IPNS 指紋到閱讀器,如:",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "o2Na0B": {
- "defaultMessage": "返回全部",
+ "cfL5uk": {
+ "defaultMessage": "已超過 200 字,目前 {numbers} 字",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ },
+ "cg1VJ2": {
+ "defaultMessage": "連接加密錢包",
"description": ""
},
- "KMcrz8": {
- "defaultMessage": "認領",
- "description": "src/views/TagDetail/Owner/index.tsx"
+ "cmtHjM": {
+ "defaultMessage": "由於你尚未發布任何作品,這裡還沒有任何數據能與你分享哦!發布第一篇作品來介紹你自己,以此開啟你的創作之旅吧!",
+ "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
},
- "63HuBz": {
- "defaultMessage": "此標籤目前無人主理",
- "description": "src/views/TagDetail/Owner/index.tsx"
+ "d4waan": {
+ "defaultMessage": "營收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "UjKkhq": {
- "defaultMessage": "作品已添加標籤",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
+ "deEeEI": {
+ "defaultMessage": "註冊",
+ "description": ""
},
- "GRtGnZ": {
- "defaultMessage": "辭去權限",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
+ "dg3JCQ": {
+ "defaultMessage": "協作者",
+ "description": ""
},
- "L7Si5/": {
- "defaultMessage": "管理社群",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
+ "dnsfmR": {
+ "defaultMessage": ",我們會儘快回覆!",
+ "description": "src/views/Help/index.tsx"
},
- "ySGgTo": {
- "defaultMessage": "添加精選",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
+ "dsBCfK": {
+ "defaultMessage": "哎呀,標籤協作者",
+ "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
},
- "wEQDC6": {
- "defaultMessage": "編輯資料",
+ "eTpiYa": {
+ "defaultMessage": "尚無支持數據",
"description": ""
},
- "beLe/F": {
- "defaultMessage": "廣播",
+ "eXDZGQ": {
+ "defaultMessage": "主理人",
"description": ""
},
- "20bImY": {
- "defaultMessage": "眾聊",
+ "ei+kyp": {
+ "defaultMessage": "圍爐名稱",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ },
+ "enMIYK": {
+ "defaultMessage": "我的",
"description": ""
},
- "jx7Hn3": {
- "defaultMessage": "作品",
+ "eov+J2": {
+ "defaultMessage": "自定義網址名稱",
"description": ""
},
- "U9IXic": {
- "defaultMessage": "添加作品",
- "description": "src/views/Circle/Profile/AddCircleArticle/Button.tsx"
+ "euNJsE": {
+ "defaultMessage": "新作品已經加入圍爐,馬上前往閱讀吧!",
+ "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
},
- "q+N5Wd": {
- "defaultMessage": "管理圍爐",
- "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
+ "fG41Ux": {
+ "defaultMessage": "登出成功",
+ "description": ""
},
- "8xPi0N": {
- "defaultMessage": "離開圍爐",
- "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
+ "fOgusL": {
+ "defaultMessage": "選擇進入方式",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "WuvE8X": {
- "defaultMessage": "{circleName} 的追蹤者",
- "description": "src/views/Circle/Profile/FollowersDialog/index.tsx"
+ "fWDtpq": {
+ "defaultMessage": "邀請中",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
},
- "XVYrS/": {
- "defaultMessage": "還沒有追蹤者",
- "description": ""
+ "ftD7Hy": {
+ "defaultMessage": " 眾聊提及了你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "+a+2ug": {
- "defaultMessage": "成員",
- "description": ""
+ "g/L3Fm": {
+ "defaultMessage": " 眾聊中發表與回覆話題 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "KL502d": {
- "defaultMessage": "資料已保存",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ "gMZfHO": {
+ "defaultMessage": "RSS 訂閱",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "rfz/fN": {
- "defaultMessage": "建議封面尺寸 1600 x 900 像素",
- "description": ""
+ "h9CG9E": {
+ "defaultMessage": "{commentType}已刪除",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "lhaIoi": {
- "defaultMessage": "請輸入姓名",
- "description": ""
+ "hWs95P": {
+ "defaultMessage": "重要訊息將透過郵件通知,請填入信箱完成設定。",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "E8W3qa": {
- "defaultMessage": "2-20 個字元",
- "description": ""
+ "hYG5fb": {
+ "defaultMessage": "人追蹤",
+ "description": "src/views/TagDetail/Followers/index.tsx"
},
- "Q8Qw5B": {
- "defaultMessage": "個人簡介",
- "description": ""
+ "hk2aiz": {
+ "defaultMessage": " 追蹤了你的圍爐",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "A8MpFX": {
- "defaultMessage": "請輸入個人簡介",
- "description": ""
+ "hrfF+i": {
+ "defaultMessage": "剛接觸加密錢包?參考 ",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "UNUROl": {
- "defaultMessage": "建議 50 字以內,最長 200 字",
+ "hrgo+E": {
+ "defaultMessage": "隱藏",
"description": ""
},
- "jvo0vs": {
- "defaultMessage": "儲存",
+ "i/4KO2": {
+ "defaultMessage": "此帳戶因為違反社區約章而被註銷",
+ "description": "src/components/UserProfile/index.tsx"
+ },
+ "iCFXtS": {
+ "defaultMessage": "歡迎未註冊或已啟用錢包登入的朋友使用",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ },
+ "ieGrWo": {
+ "defaultMessage": "追蹤",
"description": ""
},
- "A3wDZ8": {
- "defaultMessage": "我的 NFT 收藏",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
+ "ikVIu3": {
+ "defaultMessage": "篇作品",
+ "description": ""
},
- "QCo7Gc": {
- "defaultMessage": "選擇 NFT 作為你的頭像",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
+ "ipQlDG": {
+ "defaultMessage": "以郵箱登入",
+ "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
},
- "eTpiYa": {
- "defaultMessage": "尚無支持數據",
+ "itPgxd": {
+ "defaultMessage": "個人主頁",
"description": ""
},
- "/IMR+8": {
- "defaultMessage": "支持排行榜",
+ "izWS4J": {
+ "defaultMessage": "取消追蹤",
"description": ""
},
- "b3onWZ": {
- "defaultMessage": "最近 {days} 天",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
- },
- "Po+kJe": {
- "defaultMessage": "最近 {month} 個月",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
+ "jF+Mle": {
+ "defaultMessage": " 天,前去免費體驗,與大家談天說地吧。",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "A3rLZt": {
- "defaultMessage": "最近 {months} 個月",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
+ "jJ1Brc": {
+ "defaultMessage": "喜歡回應",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "zQvVDJ": {
- "defaultMessage": "全部",
+ "jL2ZHb": {
+ "defaultMessage": "驗證碼有效期 20 分鐘",
"description": ""
},
- "FOOymB": {
- "defaultMessage": "還沒有成員",
- "description": "src/views/Circle/Profile/MembersDialog/Content.tsx"
- },
- "hYG5fb": {
- "defaultMessage": "人追蹤",
- "description": "src/views/TagDetail/Followers/index.tsx"
- },
- "ANA7sk": {
- "defaultMessage": "主理",
- "description": "src/views/TagDetail/Owner/index.tsx"
+ "jgLiba": {
+ "defaultMessage": "請輸入驗證碼",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "3KNMbJ": {
- "defaultMessage": "作品",
+ "jvo0vs": {
+ "defaultMessage": "儲存",
"description": ""
},
- "4Odb0J": {
- "defaultMessage": "置頂作品",
- "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
+ "k5NnNF": {
+ "defaultMessage": "追蹤了你",
+ "description": "src/components/Notice/UserNotice/UserNewFollowerNotice.tsx"
},
- "TQLBox": {
- "defaultMessage": "取消置頂",
- "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
+ "kc79d3": {
+ "defaultMessage": "找你想看的",
+ "description": ""
},
- "ZVoJan": {
- "defaultMessage": "修訂作品",
- "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx"
+ "lD4FPZ": {
+ "defaultMessage": "請輸入電子信箱",
+ "description": ""
},
- "hrgo+E": {
- "defaultMessage": "隱藏",
+ "lIir/P": {
+ "defaultMessage": "我知道了",
"description": ""
},
- "uIdMon": {
- "defaultMessage": "確認隱藏,其他用戶將無法從站內訪問該作品。隱藏後無法回退,如需再次呈現作品,你需要重新發布。",
- "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
+ "lNjDPr": {
+ "defaultMessage": "你還沒有邀請任何用戶喔!點擊新增邀請,添加站內或站外朋友加入圍爐贈與對方免費資格的固定時長",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx"
},
- "oIkacT": {
- "defaultMessage": "作品已隱藏",
- "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
+ "ldNgRA": {
+ "defaultMessage": "Display name, can be changed later",
+ "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
},
- "K3r6DQ": {
- "defaultMessage": "刪除",
+ "lhaIoi": {
+ "defaultMessage": "請輸入姓名",
"description": ""
},
- "mikY/9": {
- "defaultMessage": "編輯",
- "description": "src/components/Comment/DropdownActions/EditButton.tsx"
- },
- "50cquj": {
- "defaultMessage": "還沒有眾聊",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "ll/ufR": {
+ "defaultMessage": "熱門",
+ "description": ""
},
- "EW5R4p": {
- "defaultMessage": "催更、提問、分享、討論…",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "mCAIcg": {
+ "defaultMessage": "站內閱讀熱門排行",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx"
},
- "9nNpKP": {
- "defaultMessage": "討論已送出",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "mPe6DK": {
+ "defaultMessage": " 訂閱了你的圍爐",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "TjWWxF": {
- "defaultMessage": "廣播已送出",
- "description": "src/views/Circle/Broadcast/Broadcast.tsx"
+ "mSAY3/": {
+ "defaultMessage": "已取消封鎖。該用戶現在可以評論你的作品和圍爐。",
+ "description": "src/components/BlockUser/Button/index.tsx"
},
"mWjpk9": {
"defaultMessage": "還沒有廣播",
"description": "src/views/Circle/Broadcast/Broadcast.tsx"
},
- "zb8Kx1": {
- "defaultMessage": "公告、提醒、碎碎念…"
+ "mikY/9": {
+ "defaultMessage": "編輯",
+ "description": "src/components/Comment/DropdownActions/EditButton.tsx"
},
- "AGcU5J": {
- "defaultMessage": "置頂",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "mjMpv4": {
+ "defaultMessage": "圍爐已更新",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "jJ1Brc": {
- "defaultMessage": "喜歡回應",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "mk+LCk": {
+ "defaultMessage": "介面設定",
+ "description": "src/views/Me/Settings/AnonymousSettings/DisplayPreferences/index.tsx"
},
- "RFzVUD": {
- "defaultMessage": "取消置頂",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "ml3SZN": {
+ "defaultMessage": "至少 8 個字元,支持英文大小寫字母、數字和特殊符號",
+ "description": ""
},
- "X+Xvgq": {
- "defaultMessage": "取消精選",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "nGBrvw": {
+ "defaultMessage": "我的收藏",
+ "description": ""
},
- "7xnrxG": {
- "defaultMessage": "作品已添加至精選",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
+ "nYeDrI": {
+ "defaultMessage": "沒有帳戶?",
+ "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
},
- "WSUAwk": {
- "defaultMessage": "添加到精選",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
+ "nsaJRn": {
+ "defaultMessage": "登入成功",
+ "description": ""
},
- "Js/Fij": {
- "defaultMessage": "作品已取消精選",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
+ "o2Na0B": {
+ "defaultMessage": "返回全部",
+ "description": ""
},
- "aa0nss": {
- "defaultMessage": "取消精選",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
+ "oIkacT": {
+ "defaultMessage": "作品已隱藏",
+ "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
},
- "32bml8": {
- "defaultMessage": "追蹤",
- "description": "src/components/Layout/SideNav/index.tsx"
+ "oNYnCM": {
+ "defaultMessage": "已註銷用戶",
+ "description": "src/components/UserProfile/index.tsx"
},
"ohgTH4": {
"defaultMessage": "追蹤中",
"description": "src/components/UserProfile/index.tsx"
},
- "Cu3Cty": {
- "defaultMessage": "月",
- "description": ""
- },
- "qlki7w": {
- "defaultMessage": "移除作品",
- "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx"
- },
"pRV+UD": {
"defaultMessage": "闔上",
"description": "src/components/Comment/DropdownActions/CollapseComment/Button.tsx"
},
- "h9CG9E": {
- "defaultMessage": "{commentType}已刪除",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
- },
- "Cdkhl8": {
- "defaultMessage": "刪除{commentType}",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
- },
- "77tYPg": {
- "defaultMessage": "確認刪除後,{commentType}會立即消失。",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
+ "ptqBN1": {
+ "defaultMessage": "暫時不要",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "cd/II9": {
- "defaultMessage": "{totalCount, plural, =1 {篇文章} other {篇文章}}",
+ "pwlQEY": {
+ "defaultMessage": "姓名",
"description": ""
},
- "ZAs170": {
- "defaultMessage": "基本資料",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "DMlmcU": {
- "defaultMessage": "免費資格",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "EQeKnO": {
- "defaultMessage": "邀請管理",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "KLQ1/z": {
- "defaultMessage": "圍爐創建成功",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "pzTOmv": {
+ "defaultMessage": "追蹤者",
+ "description": ""
},
- "mjMpv4": {
- "defaultMessage": "圍爐已更新",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "q+N5Wd": {
+ "defaultMessage": "管理圍爐",
+ "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
},
- "ei+kyp": {
+ "q9oMKE": {
"defaultMessage": "圍爐名稱",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "description": ""
},
- "tW3hM/": {
- "defaultMessage": "圍爐描述",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qPPrzm": {
+ "defaultMessage": " 支持了你的作品 ",
+ "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
- "CwWLOr": {
- "defaultMessage": "給圍爐取一個吸引人的名字吧",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qQmSxu": {
+ "defaultMessage": "你已成功登記參加空投且完成以太坊錢包設定,空投活動將在 2021/11/12 進行。你設定的空投地址:",
+ "description": "src/components/Notice/CryptoNotice/CryptoWalletAirdropNotice.tsx"
},
- "QUqfbW": {
- "defaultMessage": "說說圍爐的有趣之處,吸引支持者加入",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qYzBk8": {
+ "defaultMessage": "退訂了你的圍爐",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "JXdbo8": {
- "defaultMessage": "完成",
- "description": ""
+ "qlki7w": {
+ "defaultMessage": "移除作品",
+ "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx"
},
- "q9oMKE": {
- "defaultMessage": "圍爐名稱",
+ "qswU4E": {
+ "defaultMessage": "信箱將不作為登入使用,僅作為聯繫渠道",
"description": ""
},
- "QZXKhG": {
- "defaultMessage": "設置圍爐網址(創建後不可修改)",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
- },
- "6BXcdo": {
- "defaultMessage": "設定圍爐門檻(每月)",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
+ "qyzJxi": {
+ "defaultMessage": "航行日誌 1.0",
+ "description": "src/components/UserProfile/DropdownActions/index.tsx"
},
- "VwuiYK": {
- "defaultMessage": "Oops!此網址已被使用了,換一個試試",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
+ "rBjwQy": {
+ "defaultMessage": "微博",
+ "description": "src/components/Share/Buttons/Weibo.tsx"
},
- "gMZZ9I": {
- "defaultMessage": "2-20 個字元,僅支持英文小寫字母、數字或下劃線",
+ "rXnmeE": {
+ "defaultMessage": "確認發送",
"description": ""
},
- "+7SAix": {
- "defaultMessage": "2-12 個字元",
- "description": ""
+ "reOeq5": {
+ "defaultMessage": "你已擁有個人創作空間站,期待你的第一篇作品。",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "eov+J2": {
- "defaultMessage": "自定義網址名稱",
- "description": ""
+ "rf0ew3": {
+ "defaultMessage": "快來搭建圍爐,呼召你的支持者加入",
+ "description": "src/components/UserProfile/CircleWidget/index.tsx"
},
- "8KFsZN": {
- "defaultMessage": "閱讀次數",
+ "rfz/fN": {
+ "defaultMessage": "建議封面尺寸 1600 x 900 像素",
"description": ""
},
- "LOefol": {
- "defaultMessage": "上鎖",
- "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
- },
- "/podGX": {
- "defaultMessage": "公開",
- "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
+ "rs0YS2": {
+ "defaultMessage": "已禁言用戶",
+ "description": "src/components/UserProfile/index.tsx"
},
- "mCAIcg": {
- "defaultMessage": "站內閱讀熱門排行",
- "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx"
+ "sPgUkN": {
+ "defaultMessage": "本月營收",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "lNjDPr": {
- "defaultMessage": "你還沒有邀請任何用戶喔!點擊新增邀請,添加站內或站外朋友加入圍爐贈與對方免費資格的固定時長",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx"
+ "skbUBl": {
+ "defaultMessage": "Log in",
+ "description": "src/components/Buttons/Login/index.tsx"
},
- "RxiHr/": {
- "defaultMessage": "還沒有任何用戶回覆你的邀請喔!",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
+ "sncOwi": {
+ "defaultMessage": " 在作品中提及你",
+ "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx"
},
- "b8ogKp": {
- "defaultMessage": "新增邀請",
- "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx"
+ "stjoBH": {
+ "defaultMessage": "現在,去為你喜歡的作者打賞吧!你的每一次打賞都將為作者帶來收入。",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "FmWYRt": {
- "defaultMessage": "免費資格時長",
+ "sy+pv5": {
+ "defaultMessage": "電子郵箱",
"description": ""
},
- "Bc20la": {
- "defaultMessage": "天",
- "description": ""
+ "t7ah39": {
+ "defaultMessage": " 成為了標籤的主理人,你的作品也在其中。快來看看其他作者的精彩創作吧",
+ "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx"
},
- "O0QB1v": {
- "defaultMessage": "用戶將收到你的圍爐免費資格邀請函,設置免費的時限,邀請他們一起加入吧!",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
+ "t8/r8X": {
+ "defaultMessage": "連接加密錢包",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "rXnmeE": {
- "defaultMessage": "確認發送",
- "description": ""
+ "tQsujN": {
+ "defaultMessage": " 眾聊中回覆話題,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "ptqBN1": {
- "defaultMessage": "暫時不要",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
+ "tW3hM/": {
+ "defaultMessage": "圍爐描述",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
"tzq2+W": {
"defaultMessage": "寄出邀請",
"description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "fWDtpq": {
- "defaultMessage": "邀請中",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
- },
- "JpS59y": {
- "defaultMessage": "已接受",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
+ "u5aHb4": {
+ "defaultMessage": "複製鏈接",
+ "description": ""
},
- "Bjdw71": {
- "defaultMessage": "目前總追蹤人數",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uIdMon": {
+ "defaultMessage": "確認隱藏,其他用戶將無法從站內訪問該作品。隱藏後無法回退,如需再次呈現作品,你需要重新發布。",
+ "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
},
- "xWZr13": {
- "defaultMessage": "{follower, plural, =1 {人} other {人}}",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uVCg1l": {
+ "defaultMessage": "玩轉 Matters 實用指南",
+ "description": ""
},
- "GugBCe": {
- "defaultMessage": "本月新增追蹤人數",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uqmi/b": {
+ "defaultMessage": " 置頂了你在作品 ",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
},
- "MDNaxs": {
- "defaultMessage": "人",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uuEGON": {
+ "defaultMessage": " 眾聊中發表與回覆話題,其中有提及你 ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "zKOr2x": {
- "defaultMessage": "已追蹤用戶佔總觀看人數比例",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uw32VR": {
+ "defaultMessage": "教學指南",
+ "description": ""
},
- "AYTnjk": {
- "defaultMessage": "追蹤",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "v6YjIn": {
+ "defaultMessage": "帳戶",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "sPgUkN": {
- "defaultMessage": "本月營收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "vAc1Bw": {
+ "defaultMessage": "封鎖用戶",
+ "description": ""
},
- "Fe682o": {
- "defaultMessage": "下月預期營收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "vH8sCb": {
+ "defaultMessage": "我的圍爐",
+ "description": ""
},
- "L4NXXh": {
- "defaultMessage": "目前總營收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "wEQDC6": {
+ "defaultMessage": "編輯資料",
+ "description": ""
},
- "d4waan": {
- "defaultMessage": "營收",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "wSEOxH": {
+ "defaultMessage": "聯繫渠道",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "6OBAOi": {
- "defaultMessage": "目前總訂閱人數",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wXzTZ0": {
+ "defaultMessage": "Enter the name of your Circle",
+ "description": ""
},
- "zxy15q": {
- "defaultMessage": "{subscriber, plural, =1 {人} other {人}}",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wbcwKd": {
+ "defaultMessage": "查看全部",
+ "description": ""
},
- "TSDiqB": {
- "defaultMessage": "付費人數",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wqaNK4": {
+ "defaultMessage": "在你的圍爐 ",
+ "description": ""
},
- "XHMco9": {
- "defaultMessage": "人",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xGh9O7": {
+ "defaultMessage": "提醒:信箱將不作為登入使用,僅作為聯繫渠道",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "1qQzV0": {
- "defaultMessage": "免費邀請",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xWZr13": {
+ "defaultMessage": "{follower, plural, =1 {人} other {人}}",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "WpvsPu": {
- "defaultMessage": "訂閱",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xiKjd/": {
+ "defaultMessage": "使用電子信箱",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "SNh1n0": {
- "defaultMessage": "查看名單",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xmcVZ0": {
+ "defaultMessage": "搜尋",
+ "description": ""
},
- "2CqWQE": {
- "defaultMessage": "總數",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xwj01D": {
+ "defaultMessage": " 邀請你成為標籤的協作者",
+ "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx"
},
"y0b6Kp": {
"defaultMessage": "付費",
"description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "L0J61B": {
- "defaultMessage": "免費",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "y1Z3or": {
+ "defaultMessage": "修改界面語言",
+ "description": ""
},
- "SdXoXI": {
- "defaultMessage": "你已寄出邀請給朋友們,快去已邀請管理查看他們加入的進度吧!",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
+ "ySGgTo": {
+ "defaultMessage": "添加精選",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "OIj8pQ": {
- "defaultMessage": "成功發送邀請",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
+ "yZfKI4": {
+ "defaultMessage": "discussion and mentioned you",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "lIir/P": {
- "defaultMessage": "我知道了",
+ "zKOr2x": {
+ "defaultMessage": "已追蹤用戶佔總觀看人數比例",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ },
+ "zQvVDJ": {
+ "defaultMessage": "全部",
"description": ""
},
- "2uwwz+": {
- "defaultMessage": "累計閱讀時數代表了你的作品被登入用戶閱讀的總時數,每次閱讀過程超過一定時間後才會計入。此外,同一個用戶的多次閱讀也會進行累計。",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zb8Kx1": {
+ "defaultMessage": "公告、提醒、碎碎念…"
},
- "Z6cII7": {
- "defaultMessage": "累計閱讀時數",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zxlwbc": {
+ "defaultMessage": "等候寫入完成...",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "DXJ8ys": {
- "defaultMessage": "閱讀次數代表了你的作品被登入用戶閱讀的總次數,每次閱讀過程超過一定時間後才會計入。此外,同一個用戶的多次閱讀也會進行累計。",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zxy15q": {
+ "defaultMessage": "{subscriber, plural, =1 {人} other {人}}",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
}
}
+
From 1d153274a93839e18b509a1e1ba87083c3f22808 Mon Sep 17 00:00:00 2001
From: Matty <98379126+matters-tech@users.noreply.github.com>
Date: Wed, 12 Apr 2023 17:08:54 +0700
Subject: [PATCH 85/92] New translations default.json (English)
---
lang/en.json | 1787 ++++++++++++++++++++++++--------------------------
1 file changed, 870 insertions(+), 917 deletions(-)
diff --git a/lang/en.json b/lang/en.json
index 8bcebe2173..e33631e4be 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -1,1297 +1,1250 @@
{
- "3uQKhx": {
- "defaultMessage": "Please email",
- "description": "src/views/Help/index.tsx"
+ "+7SAix": {
+ "defaultMessage": "Must be between 2-12 characters long.",
+ "description": ""
},
- "k5NnNF": {
- "defaultMessage": " followed you",
- "description": "src/components/Notice/UserNotice/UserNewFollowerNotice.tsx"
+ "+a+2ug": {
+ "defaultMessage": "Members",
+ "description": ""
+ },
+ "+hfUcV": {
+ "defaultMessage": "sent a new broadcast on {circlename}",
+ "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ },
+ "/+XWDi": {
+ "defaultMessage": "Logbook 2.0",
+ "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ },
+ "/3G89K": {
+ "defaultMessage": " is growing",
+ "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ },
+ "/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"
+ },
+ "/IMR+8": {
+ "defaultMessage": "Top Supporters",
+ "description": ""
+ },
+ "/asuIY": {
+ "defaultMessage": "Enter Community",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
"/ns2st": {
"defaultMessage": "Download App",
"description": ""
},
- "FaTb0A": {
- "defaultMessage": "Install MetaMask",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "/nu5ho": {
+ "defaultMessage": "replied to your comment on ",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "J+LXrH": {
- "defaultMessage": "User registered by email can login and enable wallet login later",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "/podGX": {
+ "defaultMessage": "Public",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
},
- "FhWC22": {
- "defaultMessage": "Matters Community",
+ "0Azlrb": {
+ "defaultMessage": "Manage",
"description": ""
},
- "Xd0J7Y": {
- "defaultMessage": "Open Source",
+ "1EYCdR": {
+ "defaultMessage": "Tags",
"description": ""
},
- "cfL5uk": {
- "defaultMessage": "Over 200 words, current {numbers}",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ "1pFLGZ": {
+ "defaultMessage": "Bug Bounty",
+ "description": ""
},
- "dnsfmR": {
- "defaultMessage": "for bug reports or suggestions. We will reply to you as soon we can!",
- "description": "src/views/Help/index.tsx"
+ "1qQzV0": {
+ "defaultMessage": "Invitees",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "fOgusL": {
- "defaultMessage": "Choose a method to enter",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "20bImY": {
+ "defaultMessage": "Discussion",
+ "description": ""
},
- "iCFXtS": {
- "defaultMessage": "For unregistered or users enabled wallet login",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "2CqWQE": {
+ "defaultMessage": "Total",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "ZjDH42": {
- "defaultMessage": "About Us",
+ "2atspc": {
+ "defaultMessage": "Drafts",
"description": ""
},
- "6flWFg": {
- "defaultMessage": "Term of Services",
- "description": "src/views/Help/index.tsx"
+ "2eebTb": {
+ "defaultMessage": " bookmarked your article",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
},
- "uVCg1l": {
- "defaultMessage": "Explore Matters",
+ "2slIPX": {
+ "defaultMessage": "Likes",
"description": ""
},
- "HzaRKA": {
- "defaultMessage": "Migrate to Matters",
- "description": ""
+ "2uRduT": {
+ "defaultMessage": "comment",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
},
- "skbUBl": {
- "defaultMessage": "Log in",
- "description": "src/components/Buttons/Login/index.tsx"
+ "2uwwz+": {
+ "defaultMessage": "Accumulated read time indicates the total time length that registered users read.",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
},
- "t8/r8X": {
- "defaultMessage": "Continue with Wallet",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "32bml8": {
+ "defaultMessage": "Following",
+ "description": "src/components/Layout/SideNav/index.tsx"
},
- "xiKjd/": {
- "defaultMessage": "Continue with Email",
- "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
+ "3KNMbJ": {
+ "defaultMessage": "Articles",
+ "description": ""
},
- "z+209N": {
- "defaultMessage": "Register",
+ "3WKlPP": {
+ "defaultMessage": "commented in",
"description": ""
},
- "XcTMMM": {
- "defaultMessage": "Have an account?",
- "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
+ "3kbIhS": {
+ "defaultMessage": "Untitled",
+ "description": ""
},
- "ipQlDG": {
- "defaultMessage": "Login with Email",
- "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
+ "3uQKhx": {
+ "defaultMessage": "Please email",
+ "description": "src/views/Help/index.tsx"
},
- "pwlQEY": {
- "defaultMessage": "Display Name",
+ "3yk8fB": {
+ "defaultMessage": "Wallet",
"description": ""
},
- "LphWYP": {
- "defaultMessage": "Terms and Privacy Policy",
+ "3ynsJ3": {
+ "defaultMessage": "Want to know more? Check the ",
+ "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ },
+ "47FYwb": {
+ "defaultMessage": "Cancel",
"description": ""
},
- "agfumL": {
- "defaultMessage": "Next",
+ "4Odb0J": {
+ "defaultMessage": "Pin article",
+ "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
+ },
+ "4giHJT": {
+ "defaultMessage": "Have wallet questions on mobile device ? Click the ",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ },
+ "4vkwo0": {
+ "defaultMessage": "Your article has been republished to decentralized network",
+ "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.tsx"
+ },
+ "50cquj": {
+ "defaultMessage": "No discussion yet",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
+ },
+ "5FO4vn": {
+ "defaultMessage": "You do not have permission to perform this operation",
"description": ""
},
- "l5vWO8": {
- "defaultMessage": "Display name, can be changed later",
- "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
+ "5sAbzJ": {
+ "defaultMessage": " started a new topic ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
"5sg7KC": {
"defaultMessage": "Password",
"description": ""
},
- "ml3SZN": {
- "defaultMessage": "Minimum 8 characters. Uppercase/lowercase letters, numbers and symbols are allowed",
+ "63HuBz": {
+ "defaultMessage": "This tag has no manager currently",
+ "description": "src/views/TagDetail/Owner/index.tsx"
+ },
+ "69+D96": {
+ "defaultMessage": "Start Creating",
"description": ""
},
- "NzfL1d": {
- "defaultMessage": "Enter password again",
- "description": "src/components/Forms/EmailSignUpForm/Password.tsx"
+ "6BXcdo": {
+ "defaultMessage": "Set threshold for circle (per month)",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
- "XH0Lb6": {
- "defaultMessage": "Welcome to Matters!",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "6OBAOi": {
+ "defaultMessage": "subscribers_empty",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "stjoBH": {
- "defaultMessage": "Now, go like the authors you support! Your Likes will become their income",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "6flWFg": {
+ "defaultMessage": "Term of Services",
+ "description": ""
},
- "reOeq5": {
- "defaultMessage": "You have created your personal creative space. Publish your first work!",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "77tYPg": {
+ "defaultMessage": "After deletion, the {commentType} will be removed immediately",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "ANhCde": {
- "defaultMessage": "Start creating now!",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "7DIW6+": {
+ "defaultMessage": "Learn More",
+ "description": ""
},
- "/asuIY": {
- "defaultMessage": "Enter Community",
- "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
+ "7xnrxG": {
+ "defaultMessage": "The article has been added to the Trending",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
},
- "nsaJRn": {
- "defaultMessage": "Logged in successfully",
+ "8KFsZN": {
+ "defaultMessage": "Read Counts",
"description": ""
},
- "lD4FPZ": {
- "defaultMessage": "Enter Email",
+ "8cv9D4": {
+ "defaultMessage": "Next Step",
"description": ""
},
- "IFY8r4": {
- "defaultMessage": "Enter Password",
- "description": "src/components/Forms/EmailLoginForm/index.tsx"
+ "8xPi0N": {
+ "defaultMessage": "Unsubscribe Circle",
+ "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
},
- "nYeDrI": {
- "defaultMessage": "Not Registered?",
- "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
+ "9+Ddtu": {
+ "defaultMessage": "Next",
+ "description": ""
},
- "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"
+ "9nNpKP": {
+ "defaultMessage": "Discussion sent",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
},
- "N3K1H9": {
- "defaultMessage": "Matters will never ask for your wallet mnemonic through any channel.",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
+ "A3LOng": {
+ "defaultMessage": " replied to topics ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.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"
+ "A3rLZt": {
+ "defaultMessage": "Last {months} months",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "cg1VJ2": {
- "defaultMessage": "Connect Wallet",
+ "A3wDZ8": {
+ "defaultMessage": "My NFT Collections",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
+ },
+ "A41QIy": {
+ "defaultMessage": "Enter Password",
"description": ""
},
- "YjNkcK": {
- "defaultMessage": "To change, switch it directly on your wallet",
+ "A7ugfn": {
+ "defaultMessage": "More Actions",
"description": ""
},
- "wSEOxH": {
- "defaultMessage": "Contact Channel",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "CwSpld": {
- "defaultMessage": "Not for login",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "qswU4E": {
- "defaultMessage": "Email will not be used as a login but only as a contact channel.",
- "description": ""
- },
- "EfJYPI": {
- "defaultMessage": "Verification Code",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "0Rw3H/": {
- "defaultMessage": "I have read and agree to",
- "description": ""
- },
- "jgLiba": {
- "defaultMessage": "Enter verification code",
- "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
- },
- "jL2ZHb": {
- "defaultMessage": "Code will expire after 20 minutes",
- "description": ""
- },
- "4giHJT": {
- "defaultMessage": "Have wallet questions on mobile device ? Click the ",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
- },
- "uw32VR": {
- "defaultMessage": "tutorial",
+ "A8MpFX": {
+ "defaultMessage": "Enter Bio",
"description": ""
},
- "hrfF+i": {
- "defaultMessage": "Don't have a wallet yet? Check the ",
- "description": "src/components/Forms/WalletAuthForm/Select.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"
+ "AGcU5J": {
+ "defaultMessage": "Pin Broadcast",
+ "description": "src/components/Comment/DropdownActions/PinButton.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"
+ "ANA7sk": {
+ "defaultMessage": "Maintain",
+ "description": "src/views/TagDetail/Owner/index.tsx"
},
- "UOdEqi": {
- "defaultMessage": "The original login via email will be kept for you. Please note that your wallet cannot be reset once it is connected because of your account security.",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "ANhCde": {
+ "defaultMessage": "Start creating now!",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "VrOoVf": {
- "defaultMessage": "Matters will never ask your wallet key through any channel.",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "AYTnjk": {
+ "defaultMessage": "Followers",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "v6YjIn": {
- "defaultMessage": "Account",
- "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ "BHFHeY": {
+ "defaultMessage": " commented in {commentCircle}",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "H8KGyc": {
- "defaultMessage": "Enter",
+ "Bc20la": {
+ "defaultMessage": "days",
"description": ""
},
- "sy+pv5": {
- "defaultMessage": "Email",
- "description": ""
+ "Bjdw71": {
+ "defaultMessage": "followers_empty",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "JxlxVc": {
- "defaultMessage": "Forget Password",
- "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
+ "BjzRe8": {
+ "defaultMessage": ". Take a look at your income",
+ "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
- "deEeEI": {
- "defaultMessage": "Register",
+ "CBDDR5": {
+ "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
"description": ""
},
- "N2IrpM": {
- "defaultMessage": "Confirm",
- "description": ""
+ "Cdkhl8": {
+ "defaultMessage": "Delete {commentType}",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "EwVnoC": {
- "defaultMessage": "I have read and agree to",
+ "CnPG8j": {
+ "defaultMessage": "Featured",
"description": ""
},
- "9+Ddtu": {
- "defaultMessage": "Next",
+ "Cu3Cty": {
+ "defaultMessage": "month",
"description": ""
},
- "KZlRde": {
- "defaultMessage": " replied to ",
- "description": "src/components/Notice/ArticleArticleNotice/ArticleNewCollectedNotice.tsx"
- },
- "/nu5ho": {
- "defaultMessage": "replied to your comment on ",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "ZUPQzl": {
- "defaultMessage": "",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "b+LSgI": {
- "defaultMessage": " replied to your discussion on ",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "aaUBvF": {
- "defaultMessage": "",
- "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
- },
- "DIQKiC": {
- "defaultMessage": " mentioned you in a comment on ",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "jqACL/": {
- "defaultMessage": "",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "+8Q3Y4": {
- "defaultMessage": " commented in ",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "+AdTsY": {
- "defaultMessage": " discussion and mentioned you",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "ISn3eZ": {
- "defaultMessage": " broadcast and mentioned you",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "uqmi/b": {
- "defaultMessage": " pinned your comment on ",
- "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
- },
- "VjxGd7": {
- "defaultMessage": " commented on ",
- "description": "src/components/Notice/CommentNotice/ArticleNewCommentNotice.tsx"
- },
- "U/Tqmx": {
- "defaultMessage": " commented on your bookmarked article ",
- "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx"
- },
- "VoOZni": {
- "defaultMessage": " sent a new broadcast on ",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
- },
- "oaDToH": {
- "defaultMessage": "",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
+ "CwSpld": {
+ "defaultMessage": "Not for login",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "qPPrzm": {
- "defaultMessage": " supported your article ",
- "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
+ "D2Sw/t": {
+ "defaultMessage": "Add any URL in the following list into RSS reader",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "BjzRe8": {
- "defaultMessage": ". Take a look at your income",
- "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
+ "D3idYv": {
+ "defaultMessage": "Settings",
+ "description": ""
},
- "z4NaU2": {
- "defaultMessage": "Your",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
+ "DMlmcU": {
+ "defaultMessage": "Free Trial",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "bVZDVx": {
- "defaultMessage": " withdrawal process has started. Please refer to your bank for payout status.",
- "description": "src/components/Notice/TransactionNotice/PaymentPayoutNotice.tsx"
+ "DXJ8ys": {
+ "defaultMessage": "Read counts indicates how many registered users read.",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
},
- "nto8ly": {
- "defaultMessage": " subscribed your circle",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "E8W3qa": {
+ "defaultMessage": "Must be between 2-20 characters long. Chinese characters, letters, numbers and underscores are allowed.",
+ "description": ""
},
- "qYzBk8": {
- "defaultMessage": " unsubscribed your circle",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "EQeKnO": {
+ "defaultMessage": "Manage Invitation",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "LW1aX1": {
- "defaultMessage": "Congrats!",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "EW5R4p": {
+ "defaultMessage": "Request an update, ask, share and discuss",
+ "description": "src/views/Circle/Discussion/Discussion.tsx"
},
- "KyWDUu": {
- "defaultMessage": " invites you to join Circle for ",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "EfJYPI": {
+ "defaultMessage": "Verification Code",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "jF+Mle": {
- "defaultMessage": " days for free. Try it and have fun!",
- "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
+ "EoNvLu": {
+ "defaultMessage": "Created",
+ "description": "src/views/User/Articles/UserArticles.tsx"
},
- "J3yk6u": {
- "defaultMessage": "in circle",
+ "EwVnoC": {
+ "defaultMessage": "I have read and agree to",
"description": ""
},
"FALWef": {
"defaultMessage": " commented in Broadcast",
"description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
},
- "YlxpJl": {
- "defaultMessage": " Broadcast and mentioned you ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
- },
- "qQmSxu": {
- "defaultMessage": "Airdrop registration completed. Your NFT will be revealed on November 12. Confirm your ETH wallet address:",
- "description": "src/components/Notice/CryptoNotice/CryptoWalletAirdropNotice.tsx"
- },
- "UgvfcU": {
- "defaultMessage": "You have successfully completed Ethereum wallet settings. Please confirm wallet address:",
- "description": "src/components/Notice/CryptoNotice/CryptoWalletConnectedNotice.tsx"
- },
- "+hfUcV": {
- "defaultMessage": "sent a new broadcast on {circlename}",
- "description": "src/components/Notice/CommentNotice/CircleNewBroadcastNotice.tsx"
- },
- "An0rpe": {
- "defaultMessage": "{circlename} Broadcast",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
- },
- "VO4Elt": {
- "defaultMessage": " mentioned you in a comment on {commentArticle}",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
- },
- "BHFHeY": {
- "defaultMessage": " commented in {commentCircle}",
- "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
+ "FOOymB": {
+ "defaultMessage": "No members yet",
+ "description": "src/views/Circle/Profile/MembersDialog/Content.tsx"
},
- "5sAbzJ": {
- "defaultMessage": " started a new topic ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "FaTb0A": {
+ "defaultMessage": "Install MetaMask",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "A3LOng": {
- "defaultMessage": " replied to topics ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "Fe682o": {
+ "defaultMessage": "Next Month (Estimation)",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "ftD7Hy": {
- "defaultMessage": " mentioned you ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "FhWC22": {
+ "defaultMessage": "Matters Community",
+ "description": ""
},
- "g/L3Fm": {
- "defaultMessage": " posted and replied to topics ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
+ "FmWYRt": {
+ "defaultMessage": "Free trial period",
+ "description": ""
},
"GBm/sD": {
"defaultMessage": " posted a new topic and mentioned you ",
"description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "tQsujN": {
- "defaultMessage": " replied to topics and mentioned you ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
- },
- "uuEGON": {
- "defaultMessage": " posted and replied to topics and mentioned you ",
- "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
- },
- "hk2aiz": {
- "defaultMessage": " followed your circle",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "GRtGnZ": {
+ "defaultMessage": "Resign From Maintainer",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "mPe6DK": {
- "defaultMessage": " subscribed your circle",
- "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
+ "GZJpDf": {
+ "defaultMessage": "Analytics",
+ "description": ""
},
- "JIjMWL": {
- "defaultMessage": "Your article has been published to decentralized network",
- "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx"
+ "GugBCe": {
+ "defaultMessage": "New Followers This Month",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "sncOwi": {
- "defaultMessage": " mentioned you in an article",
- "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx"
+ "H0JBH6": {
+ "defaultMessage": "Log Out",
+ "description": ""
},
- "2eebTb": {
- "defaultMessage": " bookmarked your article",
- "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ "H8KGyc": {
+ "defaultMessage": "Enter",
+ "description": ""
},
- "YIes/F": {
- "defaultMessage": "etc. {actorsCount} users",
- "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ "HFVDeB": {
+ "defaultMessage": "Related Tags",
+ "description": "src/views/TagDetail/RelatedTags/index.tsx"
},
- "PjT72J": {
- "defaultMessage": " liked your article",
- "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx"
+ "HtSDyc": {
+ "defaultMessage": "Help Center",
+ "description": ""
},
- "4vkwo0": {
- "defaultMessage": "Your article has been republished to decentralized network",
- "description": "src/components/Notice/ArticleNotice/RevisedArticlePublishedNotice.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"
},
- "QV19cI": {
- "defaultMessage": "Failed to republish article",
- "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx"
+ "HzaRKA": {
+ "defaultMessage": "Migrate to Matters",
+ "description": ""
},
- "euNJsE": {
- "defaultMessage": "A new article has been added to the circle, read it now!",
- "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ "IFY8r4": {
+ "defaultMessage": "Enter Password",
+ "description": "src/components/Forms/EmailLoginForm/index.tsx"
},
- "/3G89K": {
- "defaultMessage": " is growing",
- "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
+ "Ic4hqD": {
+ "defaultMessage": "words",
+ "description": "src/views/User/Articles/UserArticles.tsx"
},
- "wqaNK4": {
- "defaultMessage": " in your circle ",
- "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
+ "J+LXrH": {
+ "defaultMessage": "User registered by email can login and enable wallet login later",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "xwj01D": {
- "defaultMessage": " invites you to become a collaborator",
- "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx"
+ "J+dIsA": {
+ "defaultMessage": "Subscriptions",
+ "description": ""
},
- "t7ah39": {
- "defaultMessage": " just became the maintainer of a tag your article is in. Check out more articles under this tag",
- "description": "src/components/Notice/TagNotice/TagAdoptionNotice.tsx"
+ "J3yk6u": {
+ "defaultMessage": "in circle",
+ "description": ""
},
- "O03Rkc": {
- "defaultMessage": " resigned as tag collaborator. You can invite new collaborators to join",
- "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
+ "JIjMWL": {
+ "defaultMessage": "Your article has been published to decentralized network",
+ "description": "src/components/Notice/ArticleNotice/ArticlePublishedNotice.tsx"
},
- "dsBCfK": {
- "defaultMessage": "uh-oh,",
- "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
+ "JXdbo8": {
+ "defaultMessage": "Done",
+ "description": ""
},
"Jc+W6M": {
"defaultMessage": " resigned as tag maintainer. Would you like to be the new tag maintainer?",
"description": "src/components/Notice/TagNotice/TagLeaveNotice.tsx"
},
- "OKhRC6": {
- "defaultMessage": "Share",
- "description": ""
+ "JpS59y": {
+ "defaultMessage": "Accepted",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
},
- "u5aHb4": {
- "defaultMessage": "Copy Link",
+ "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"
+ },
+ "K3r6DQ": {
+ "defaultMessage": "Delete",
"description": ""
},
- "NONfAh": {
- "defaultMessage": "Douban",
- "description": "src/components/Share/Buttons/Douban.tsx"
+ "KL502d": {
+ "defaultMessage": "Profile updated",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
},
- "rBjwQy": {
- "defaultMessage": "Weibo",
- "description": "src/components/Share/Buttons/Weibo.tsx"
+ "KLQ1/z": {
+ "defaultMessage": "Circle successfully created",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "bBYO6x": {
- "defaultMessage": "Unblock",
- "description": "src/components/BlockUser/Button/index.tsx"
+ "KMcrz8": {
+ "defaultMessage": "Maintain Tag",
+ "description": "src/views/TagDetail/Owner/index.tsx"
},
- "vAc1Bw": {
- "defaultMessage": "Block User",
- "description": ""
+ "KZlRde": {
+ "defaultMessage": " replied to ",
+ "description": "src/components/Notice/ArticleArticleNotice/ArticleNewCollectedNotice.tsx"
},
- "mSAY3/": {
- "defaultMessage": "User unblocked. User can now comment on your articles.",
- "description": "src/components/BlockUser/Button/index.tsx"
+ "KyWDUu": {
+ "defaultMessage": " invites you to join Circle for ",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "/+XWDi": {
- "defaultMessage": "Logbook 2.0",
- "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ "L0J61B": {
+ "defaultMessage": "Free",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "qyzJxi": {
- "defaultMessage": "Logbook 1.0",
- "description": "src/components/UserProfile/DropdownActions/index.tsx"
+ "L4NXXh": {
+ "defaultMessage": "Total",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "A7ugfn": {
- "defaultMessage": "More Actions",
- "description": ""
+ "L7Si5/": {
+ "defaultMessage": "Manage Community",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "b1FfGy": {
- "defaultMessage": "Content Feed",
- "description": "src/components/UserProfile/index.tsx"
+ "LGox1K": {
+ "defaultMessage": "Followed",
+ "description": ""
},
- "/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"
+ "LOefol": {
+ "defaultMessage": "Paywalled",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
+ },
+ "LW1aX1": {
+ "defaultMessage": "Congrats!",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
"Lc/azT": {
"defaultMessage": "IPNS Subscription",
"description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "cf37Zy": {
- "defaultMessage": "Add hash from IPFS into compatible reader such as ",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "LphWYP": {
+ "defaultMessage": "Terms and Privacy Policy",
+ "description": ""
},
- "zxlwbc": {
- "defaultMessage": "Waiting ...",
- "description": "src/components/Dialogs/RssFeedDialog/Content.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"
},
- "gMZfHO": {
- "defaultMessage": "RSS Subscription",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "MDNaxs": {
+ "defaultMessage": "followers",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "D2Sw/t": {
- "defaultMessage": "Add any URL in the following list into RSS reader",
- "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
+ "MkwOFW": {
+ "defaultMessage": "Read History",
+ "description": ""
},
- "rf0ew3": {
- "defaultMessage": "Come build a Circle and call on your supporters to join you!",
- "description": "src/components/UserProfile/CircleWidget/index.tsx"
+ "N2IrpM": {
+ "defaultMessage": "Confirm",
+ "description": ""
},
- "sT9HoG": {
- "defaultMessage": "Welcome to Matters, a free, autonomous and permanent space for creation and civil discourse.",
- "description": "src/views/Follow/PickAuthors/index.tsx"
+ "N3K1H9": {
+ "defaultMessage": "Matters will never ask for your wallet mnemonic through any channel.",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "7DIW6+": {
- "defaultMessage": "Learn More",
+ "NAidKb": {
+ "defaultMessage": "Notifications",
"description": ""
},
- "Z6ewE3": {
- "defaultMessage": "Build Together",
- "description": "src/views/Me/Settings/AnonymousSettings/Enhance/index.tsx"
+ "NONfAh": {
+ "defaultMessage": "Douban",
+ "description": "src/components/Share/Buttons/Douban.tsx"
},
- "1pFLGZ": {
- "defaultMessage": "Bug Bounty",
- "description": ""
+ "NzfL1d": {
+ "defaultMessage": "Enter password again",
+ "description": "src/components/Forms/EmailSignUpForm/Password.tsx"
},
- "mk+LCk": {
- "defaultMessage": "Display Preferences",
- "description": "src/views/Me/Settings/AnonymousSettings/DisplayPreferences/index.tsx"
+ "O03Rkc": {
+ "defaultMessage": " resigned as tag collaborator. You can invite new collaborators to join",
+ "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
},
- "y1Z3or": {
- "defaultMessage": "Language",
- "description": ""
+ "O0QB1v": {
+ "defaultMessage": "Friends will receive free trial invitations to Circle. Set up your invitations now!",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "itPgxd": {
- "defaultMessage": "Profile",
- "description": ""
+ "OIj8pQ": {
+ "defaultMessage": "Invitation Sent",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
},
- "vH8sCb": {
- "defaultMessage": "Circle",
+ "OKhRC6": {
+ "defaultMessage": "Share",
"description": ""
},
- "2atspc": {
- "defaultMessage": "Drafts",
- "description": ""
+ "PjT72J": {
+ "defaultMessage": " liked your article",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewAppreciationNotice.tsx"
},
- "3yk8fB": {
- "defaultMessage": "Wallet",
- "description": ""
+ "Po+kJe": {
+ "defaultMessage": "Last {months} month",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "GZJpDf": {
- "defaultMessage": "Analytics",
+ "Pp/0po": {
+ "defaultMessage": "Shuffle",
"description": ""
},
- "nGBrvw": {
- "defaultMessage": "Bookmarks",
+ "Q8Qw5B": {
+ "defaultMessage": "Description",
"description": ""
},
- "2slIPX": {
- "defaultMessage": "Likes",
- "description": ""
+ "QCo7Gc": {
+ "defaultMessage": "Select NFT as your avatar",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
},
- "2uRduT": {
- "defaultMessage": "",
- "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
+ "QUqfbW": {
+ "defaultMessage": "Describe more about your Circle",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "MkwOFW": {
- "defaultMessage": "Read History",
+ "QV19cI": {
+ "defaultMessage": "Failed to republish article",
+ "description": "src/components/Notice/ArticleNotice/RevisedArticleNotPublishedNotice.tsx"
+ },
+ "QZXKhG": {
+ "defaultMessage": "Set the Circle URL (cannot be modified after creation)",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
+ },
+ "RFzVUD": {
+ "defaultMessage": "Unpin Broadcast",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ },
+ "RxiHr/": {
+ "defaultMessage": "friends have not accepted your invitations.",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
+ },
+ "SENRqu": {
+ "defaultMessage": "Help",
"description": ""
},
- "fG41Ux": {
- "defaultMessage": "Logged out successfully",
+ "SNh1n0": {
+ "defaultMessage": "View Members",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ },
+ "SdXoXI": {
+ "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": {
+ "defaultMessage": "Required",
"description": ""
},
"Szd1tH": {
"defaultMessage": "Failed to log out, please try again.",
"description": ""
},
- "HtSDyc": {
- "defaultMessage": "Help Center",
- "description": ""
+ "TQLBox": {
+ "defaultMessage": "Unpin",
+ "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
},
- "D3idYv": {
- "defaultMessage": "Settings",
- "description": ""
+ "TSDiqB": {
+ "defaultMessage": "Subscribers",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "H0JBH6": {
- "defaultMessage": "Log Out",
- "description": ""
+ "TjWWxF": {
+ "defaultMessage": "Broadcast sent",
+ "description": "src/views/Circle/Broadcast/Broadcast.tsx"
},
- "cE4Hfw": {
- "defaultMessage": "Discover",
+ "TzhzIH": {
+ "defaultMessage": "Creators",
"description": ""
},
- "i/4KO2": {
- "defaultMessage": "This account is archived due to violation of community guidelines",
- "description": "src/components/UserProfile/index.tsx"
+ "U/Tqmx": {
+ "defaultMessage": " commented on your bookmarked article ",
+ "description": "src/components/Notice/CommentNotice/SubscribedArticleNewCommentNotice.tsx"
},
- "oNYnCM": {
- "defaultMessage": "Account Archived",
- "description": "src/components/UserProfile/index.tsx"
+ "U9IXic": {
+ "defaultMessage": "添加作品",
+ "description": "src/views/Circle/Profile/AddCircleArticle/Button.tsx"
},
- "rs0YS2": {
- "defaultMessage": "Account Banned",
- "description": "src/components/UserProfile/index.tsx"
+ "UNUROl": {
+ "defaultMessage": "Maximum 200 characters.",
+ "description": ""
},
- "EoNvLu": {
- "defaultMessage": "Created",
- "description": "src/views/User/Articles/UserArticles.tsx"
+ "UOdEqi": {
+ "defaultMessage": "The original login via email will be kept for you. Please note that your wallet cannot be reset once it is connected because of your account security.",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ },
+ "UgvfcU": {
+ "defaultMessage": "You have successfully completed Ethereum wallet settings. Please confirm wallet address:",
+ "description": "src/components/Notice/CryptoNotice/CryptoWalletConnectedNotice.tsx"
+ },
+ "UjKkhq": {
+ "defaultMessage": "Tags added",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
"UxfPXa": {
"defaultMessage": "In total",
"description": "src/views/User/Articles/UserArticles.tsx"
},
- "Ic4hqD": {
- "defaultMessage": "words",
- "description": "src/views/User/Articles/UserArticles.tsx"
+ "VO4Elt": {
+ "defaultMessage": " mentioned you in a comment on {commentArticle}",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "J+dIsA": {
- "defaultMessage": "Subscriptions",
- "description": ""
+ "VjxGd7": {
+ "defaultMessage": " commented on ",
+ "description": "src/components/Notice/CommentNotice/ArticleNewCommentNotice.tsx"
+ },
+ "VrOoVf": {
+ "defaultMessage": "Matters will never ask your wallet key through any channel.",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
+ },
+ "VwuiYK": {
+ "defaultMessage": "This URL name has already been used, try another one",
+ "description": "src/components/Forms/CreateCircleForm/Init.tsx"
},
"WBVVYd": {
"defaultMessage": "Responses",
"description": ""
},
- "1EYCdR": {
- "defaultMessage": "Tags",
- "description": ""
+ "WSUAwk": {
+ "defaultMessage": "Add to Featured",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
},
- "NAidKb": {
- "defaultMessage": "Notifications",
- "description": ""
+ "WpvsPu": {
+ "defaultMessage": "Subscribe",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "enMIYK": {
- "defaultMessage": "My Page",
- "description": ""
+ "WuvE8X": {
+ "defaultMessage": "Followers of {circleName}",
+ "description": "src/views/Circle/Profile/FollowersDialog/index.tsx"
},
- "xmcVZ0": {
- "defaultMessage": "Search",
- "description": ""
+ "X+Xvgq": {
+ "defaultMessage": "Unpin Comment",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
},
- "47FYwb": {
- "defaultMessage": "Cancel",
- "description": ""
+ "XH0Lb6": {
+ "defaultMessage": "Welcome to Matters!",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "ll/ufR": {
- "defaultMessage": "Trending",
- "description": ""
+ "XHMco9": {
+ "defaultMessage": "subscribers",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "adThp5": {
- "defaultMessage": "Latest",
+ "XVYrS/": {
+ "defaultMessage": "No followers yet",
"description": ""
},
- "CnPG8j": {
- "defaultMessage": "Featured",
- "description": ""
+ "XcTMMM": {
+ "defaultMessage": "Have an account?",
+ "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
},
- "wbcwKd": {
- "defaultMessage": "View All",
+ "Xd0J7Y": {
+ "defaultMessage": "Open Source",
"description": ""
},
"XgdZSb": {
"defaultMessage": "Authors",
"description": ""
},
- "kc79d3": {
- "defaultMessage": "Topics",
- "description": ""
+ "Xz/AHp": {
+ "defaultMessage": "broadcast and mentioned you",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "Pp/0po": {
- "defaultMessage": "Shuffle",
+ "YIes/F": {
+ "defaultMessage": "etc. {actorsCount} users",
+ "description": "src/components/Notice/ArticleNotice/ArticleNewSubscriberNotice.tsx"
+ },
+ "YjNkcK": {
+ "defaultMessage": "To change, switch it directly on your wallet",
"description": ""
},
- "6gOpfl": {
- "defaultMessage": "You won't see announcements for 7 days",
- "description": "src/views/Home/Announcements/index.tsx"
+ "YlxpJl": {
+ "defaultMessage": " Broadcast and mentioned you ",
+ "description": "src/components/Notice/CircleNotice/CircleNewBroadcastComments.tsx"
},
- "3kbIhS": {
- "defaultMessage": "Untitled",
- "description": ""
+ "Z6cII7": {
+ "defaultMessage": "Accumulated Read Time",
+ "description": "src/components/Dialogs/HelpDialog/index.tsx"
},
- "MW9PzQ": {
- "defaultMessage": "支持排行榜",
- "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ "Z6ewE3": {
+ "defaultMessage": "Build Together",
+ "description": "src/views/Me/Settings/AnonymousSettings/Enhance/index.tsx"
},
- "cmtHjM": {
- "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"
+ "ZAs170": {
+ "defaultMessage": "Profile",
+ "description": "src/views/Circle/Settings/index.tsx"
},
- "69+D96": {
- "defaultMessage": "Start Creating",
- "description": ""
+ "ZUPQzl": {
+ "defaultMessage": "comment",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "3ynsJ3": {
- "defaultMessage": "Want to know more? Check the ",
- "description": "src/views/Me/Analytics/EmptyAnalytics/index.tsx"
+ "ZVoJan": {
+ "defaultMessage": "Edit",
+ "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx"
},
- "0Azlrb": {
- "defaultMessage": "Manage",
+ "ZjDH42": {
+ "defaultMessage": "About Us",
"description": ""
},
- "eXDZGQ": {
- "defaultMessage": "Maintainer",
- "description": ""
+ "aa0nss": {
+ "defaultMessage": "Unpin from Trending",
+ "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
},
- "dg3JCQ": {
- "defaultMessage": "collaborators",
- "description": ""
+ "aaUBvF": {
+ "defaultMessage": "comment_circle",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
},
- "TzhzIH": {
- "defaultMessage": "Creators",
+ "adThp5": {
+ "defaultMessage": "Latest",
"description": ""
},
- "Pdx3j1": {
- "defaultMessage": "New Article",
- "description": "src/views/TagDetail/Buttons/AddButton/CreateDraftMenuItem/index.tsx"
+ "b+LSgI": {
+ "defaultMessage": " replied to your discussion on ",
+ "description": "src/components/Notice/CommentCommentNotice/CommentNewReplyNotice.tsx"
+ },
+ "b1FfGy": {
+ "defaultMessage": "Content Feed",
+ "description": "src/components/UserProfile/index.tsx"
},
- "5FO4vn": {
- "defaultMessage": "You do not have permission to perform this operation",
- "description": ""
+ "b3onWZ": {
+ "defaultMessage": "Last {days} days",
+ "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
},
- "8ttGfR": {
- "defaultMessage": "Add Article",
- "description": "src/views/TagDetail/Buttons/AddButton/AddMyArticlesButton/index.tsx"
+ "b8ogKp": {
+ "defaultMessage": "Add Invitation",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx"
},
- "ieGrWo": {
- "defaultMessage": "Follow",
- "description": ""
+ "bBYO6x": {
+ "defaultMessage": "Unblock",
+ "description": "src/components/BlockUser/Button/index.tsx"
},
- "izWS4J": {
- "defaultMessage": "Unfollow",
+ "beLe/F": {
+ "defaultMessage": "Broadcast",
"description": ""
},
- "LGox1K": {
- "defaultMessage": "Followed",
+ "cE4Hfw": {
+ "defaultMessage": "Discover",
"description": ""
},
- "3KNMbJ": {
- "defaultMessage": "Articles",
+ "cd/II9": {
+ "defaultMessage": "{totalCount, plural, =1 {article} other {articles}}",
"description": ""
},
- "HFVDeB": {
- "defaultMessage": "Related Tags",
- "description": "src/views/TagDetail/RelatedTags/index.tsx"
+ "cf37Zy": {
+ "defaultMessage": "Add hash from IPFS into compatible reader such as ",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "o2Na0B": {
- "defaultMessage": "Back to All",
+ "cfL5uk": {
+ "defaultMessage": "Over 200 words, current {numbers}",
+ "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ },
+ "cg1VJ2": {
+ "defaultMessage": "Connect Wallet",
"description": ""
},
- "KMcrz8": {
- "defaultMessage": "Maintain Tag",
- "description": "src/views/TagDetail/Owner/index.tsx"
+ "cmtHjM": {
+ "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"
},
- "63HuBz": {
- "defaultMessage": "This tag has no manager currently",
- "description": "src/views/TagDetail/Owner/index.tsx"
+ "d4waan": {
+ "defaultMessage": "Income",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "pzTOmv": {
- "defaultMessage": "Followers",
+ "deEeEI": {
+ "defaultMessage": "Register",
"description": ""
},
- "UjKkhq": {
- "defaultMessage": "Tags added",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
- },
- "GRtGnZ": {
- "defaultMessage": "Resign From Maintainer",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
+ "dg3JCQ": {
+ "defaultMessage": "collaborators",
+ "description": ""
},
- "L7Si5/": {
- "defaultMessage": "Manage Community",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
+ "dnsfmR": {
+ "defaultMessage": "for bug reports or suggestions. We will reply to you as soon we can!",
+ "description": "src/views/Help/index.tsx"
},
- "ySGgTo": {
- "defaultMessage": "Add Articles into Featured",
- "description": "src/views/TagDetail/DropdownActions/index.tsx"
+ "dsBCfK": {
+ "defaultMessage": "uh-oh,",
+ "description": "src/components/Notice/TagNotice/TagLeaveEditorNotice.tsx"
},
- "wEQDC6": {
- "defaultMessage": "Edit",
+ "eTpiYa": {
+ "defaultMessage": "No data yet.",
"description": ""
},
- "beLe/F": {
- "defaultMessage": "Broadcast",
+ "eXDZGQ": {
+ "defaultMessage": "Maintainer",
"description": ""
},
- "20bImY": {
- "defaultMessage": "Discussion",
+ "ei+kyp": {
+ "defaultMessage": "Name of the Circle",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ },
+ "enMIYK": {
+ "defaultMessage": "My Page",
"description": ""
},
- "U9IXic": {
- "defaultMessage": "Add Articles",
- "description": "src/views/Circle/Profile/AddCircleArticle/Button.tsx"
+ "eov+J2": {
+ "defaultMessage": "Custom URL Name",
+ "description": ""
},
- "q+N5Wd": {
- "defaultMessage": "Manage Circle",
- "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
+ "euNJsE": {
+ "defaultMessage": "A new article has been added to the circle, read it now!",
+ "description": "src/components/Notice/ArticleNotice/CircleNewArticle.tsx"
},
- "8xPi0N": {
- "defaultMessage": "Unsubscribe Circle",
- "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
+ "fG41Ux": {
+ "defaultMessage": "Logged out successfully",
+ "description": ""
},
- "WuvE8X": {
- "defaultMessage": "Followers of {circleName}",
- "description": "src/views/Circle/Profile/FollowersDialog/index.tsx"
+ "fOgusL": {
+ "defaultMessage": "Choose a method to enter",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "XVYrS/": {
- "defaultMessage": "No followers yet",
- "description": ""
+ "fWDtpq": {
+ "defaultMessage": "Pending",
+ "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
},
- "+a+2ug": {
- "defaultMessage": "Members",
- "description": ""
+ "ftD7Hy": {
+ "defaultMessage": " mentioned you ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "KL502d": {
- "defaultMessage": "Profile updated",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/Content.tsx"
+ "g/L3Fm": {
+ "defaultMessage": " posted and replied to topics ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "rfz/fN": {
- "defaultMessage": "Recommended size: 1600px x 900px",
- "description": ""
+ "gMZfHO": {
+ "defaultMessage": "RSS Subscription",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "lhaIoi": {
- "defaultMessage": "Enter Display Name",
- "description": ""
+ "h9CG9E": {
+ "defaultMessage": "{commentType} has been deleted",
+ "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
},
- "E8W3qa": {
- "defaultMessage": "Must be between 2-20 characters long. Chinese characters, letters, numbers and underscores are allowed.",
- "description": ""
+ "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"
},
- "Q8Qw5B": {
- "defaultMessage": "Description",
- "description": ""
+ "hYG5fb": {
+ "defaultMessage": "are following",
+ "description": "src/views/TagDetail/Followers/index.tsx"
},
- "A8MpFX": {
- "defaultMessage": "Enter Bio",
- "description": ""
+ "hk2aiz": {
+ "defaultMessage": " followed your circle",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "UNUROl": {
- "defaultMessage": "Maximum 200 characters.",
- "description": ""
+ "hrfF+i": {
+ "defaultMessage": "Don't have a wallet yet? Check the ",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "jvo0vs": {
- "defaultMessage": "Save",
+ "hrgo+E": {
+ "defaultMessage": "Archive",
"description": ""
},
- "A3wDZ8": {
- "defaultMessage": "My NFT Collections",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
+ "i/4KO2": {
+ "defaultMessage": "This account is archived due to violation of community guidelines",
+ "description": "src/components/UserProfile/index.tsx"
},
- "QCo7Gc": {
- "defaultMessage": "Select NFT as your avatar",
- "description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
+ "iCFXtS": {
+ "defaultMessage": "For unregistered or users enabled wallet login",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "eTpiYa": {
- "defaultMessage": "No data yet.",
+ "ieGrWo": {
+ "defaultMessage": "Follow",
"description": ""
},
- "/IMR+8": {
- "defaultMessage": "Top Supporters",
+ "ikVIu3": {
+ "defaultMessage": "articles",
"description": ""
},
- "b3onWZ": {
- "defaultMessage": "Last {days} days",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
- },
- "Po+kJe": {
- "defaultMessage": "Last {months} month",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
+ "ipQlDG": {
+ "defaultMessage": "Login with Email",
+ "description": "src/components/Forms/EmailSignUpForm/Buttons.tsx"
},
- "A3rLZt": {
- "defaultMessage": "Last {months} months",
- "description": "src/views/Me/Analytics/SelectPeriod/index.tsx"
+ "itPgxd": {
+ "defaultMessage": "Profile",
+ "description": ""
},
- "zQvVDJ": {
- "defaultMessage": "All",
+ "izWS4J": {
+ "defaultMessage": "Unfollow",
"description": ""
},
- "FOOymB": {
- "defaultMessage": "No members yet",
- "description": "src/views/Circle/Profile/MembersDialog/Content.tsx"
+ "jF+Mle": {
+ "defaultMessage": " days for free. Try it and have fun!",
+ "description": "src/components/Notice/CircleNotice/CircleInvitationNotice.tsx"
},
- "ikVIu3": {
- "defaultMessage": "articles",
+ "jJ1Brc": {
+ "defaultMessage": "Pin Comment",
+ "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ },
+ "jL2ZHb": {
+ "defaultMessage": "Code will expire after 20 minutes",
"description": ""
},
- "hYG5fb": {
- "defaultMessage": "are following",
- "description": "src/views/TagDetail/Followers/index.tsx"
+ "jgLiba": {
+ "defaultMessage": "Enter verification code",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "ANA7sk": {
- "defaultMessage": "Maintain",
- "description": "src/views/TagDetail/Owner/index.tsx"
+ "jvo0vs": {
+ "defaultMessage": "Save",
+ "description": ""
},
- "4Odb0J": {
- "defaultMessage": "Pin article",
- "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
+ "k5NnNF": {
+ "defaultMessage": " followed you",
+ "description": "src/components/Notice/UserNotice/UserNewFollowerNotice.tsx"
},
- "TQLBox": {
- "defaultMessage": "Unpin",
- "description": "src/components/ArticleDigest/DropdownActions/StickyButton.tsx"
+ "kc79d3": {
+ "defaultMessage": "Topics",
+ "description": ""
},
- "ZVoJan": {
- "defaultMessage": "Edit",
- "description": "src/components/ArticleDigest/DropdownActions/EditButton.tsx"
+ "lD4FPZ": {
+ "defaultMessage": "Enter Email",
+ "description": ""
},
- "hrgo+E": {
- "defaultMessage": "Archive",
+ "lIir/P": {
+ "defaultMessage": "I see",
"description": ""
},
- "uIdMon": {
- "defaultMessage": "Are you sure you want to archive the article?",
- "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
+ "lNjDPr": {
+ "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"
},
- "oIkacT": {
- "defaultMessage": "Article is hidden",
- "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
+ "ldNgRA": {
+ "defaultMessage": "Display name, can be changed later",
+ "description": "src/components/Forms/EmailSignUpForm/Init.tsx"
},
- "K3r6DQ": {
- "defaultMessage": "Delete",
+ "lhaIoi": {
+ "defaultMessage": "Enter Display Name",
"description": ""
},
- "mikY/9": {
- "defaultMessage": "Edit",
- "description": "src/components/Comment/DropdownActions/EditButton.tsx"
- },
- "50cquj": {
- "defaultMessage": "No discussion yet",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "ll/ufR": {
+ "defaultMessage": "Trending",
+ "description": ""
},
- "EW5R4p": {
- "defaultMessage": "Request an update, ask, share and discuss",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "mCAIcg": {
+ "defaultMessage": "Hottest",
+ "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx"
},
- "9nNpKP": {
- "defaultMessage": "Discussion sent",
- "description": "src/views/Circle/Discussion/Discussion.tsx"
+ "mPe6DK": {
+ "defaultMessage": " subscribed your circle",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "TjWWxF": {
- "defaultMessage": "Broadcast sent",
- "description": "src/views/Circle/Broadcast/Broadcast.tsx"
+ "mSAY3/": {
+ "defaultMessage": "User unblocked. User can now comment on your articles.",
+ "description": "src/components/BlockUser/Button/index.tsx"
},
"mWjpk9": {
"defaultMessage": "No broadcast yet.",
"description": "src/views/Circle/Broadcast/Broadcast.tsx"
},
- "zb8Kx1": {
- "defaultMessage": "Announcement, reminder, chattering..."
+ "mikY/9": {
+ "defaultMessage": "Edit",
+ "description": "src/components/Comment/DropdownActions/EditButton.tsx"
},
- "AGcU5J": {
- "defaultMessage": "Pin Broadcast",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "mjMpv4": {
+ "defaultMessage": "Circle Edited",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
- "jJ1Brc": {
- "defaultMessage": "Pin Comment",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "mk+LCk": {
+ "defaultMessage": "Display Preferences",
+ "description": "src/views/Me/Settings/AnonymousSettings/DisplayPreferences/index.tsx"
},
- "RFzVUD": {
- "defaultMessage": "Unpin Broadcast",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "ml3SZN": {
+ "defaultMessage": "Minimum 8 characters. Uppercase/lowercase letters, numbers and symbols are allowed",
+ "description": ""
},
- "X+Xvgq": {
- "defaultMessage": "Unpin Comment",
- "description": "src/components/Comment/DropdownActions/PinButton.tsx"
+ "nGBrvw": {
+ "defaultMessage": "Bookmarks",
+ "description": ""
},
- "7xnrxG": {
- "defaultMessage": "The article has been added to the Trending",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
+ "nYeDrI": {
+ "defaultMessage": "Not Registered?",
+ "description": "src/components/Forms/EmailLoginForm/Buttons.tsx"
},
- "WSUAwk": {
- "defaultMessage": "Add to Featured",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagSelectedButton.tsx"
+ "nsaJRn": {
+ "defaultMessage": "Logged in successfully",
+ "description": ""
},
- "Js/Fij": {
- "defaultMessage": "This article has been removed from Trending",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
+ "o2Na0B": {
+ "defaultMessage": "Back to All",
+ "description": ""
},
- "aa0nss": {
- "defaultMessage": "Unpin from Trending",
- "description": "src/components/ArticleDigest/DropdownActions/SetTagUnselectedButton.tsx"
+ "oIkacT": {
+ "defaultMessage": "Article is hidden",
+ "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
},
- "32bml8": {
- "defaultMessage": "Following",
- "description": "src/components/Layout/SideNav/index.tsx"
+ "oNYnCM": {
+ "defaultMessage": "Account Archived",
+ "description": "src/components/UserProfile/index.tsx"
},
"ohgTH4": {
"defaultMessage": "Following",
"description": "src/components/UserProfile/index.tsx"
},
- "Cu3Cty": {
- "defaultMessage": "month",
- "description": ""
- },
- "qlki7w": {
- "defaultMessage": "Remove Article",
- "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx"
- },
"pRV+UD": {
"defaultMessage": "Collapse",
"description": "src/components/Comment/DropdownActions/CollapseComment/Button.tsx"
},
- "h9CG9E": {
- "defaultMessage": "{commentType} has been deleted",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
- },
- "Cdkhl8": {
- "defaultMessage": "Delete {commentType}",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
- },
- "77tYPg": {
- "defaultMessage": "After deletion, the {commentType} will be removed immediately",
- "description": "src/components/Comment/DropdownActions/DeleteComment/Dialog.tsx"
+ "ptqBN1": {
+ "defaultMessage": "Not Now",
+ "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "cd/II9": {
- "defaultMessage": "{totalCount, plural, =1 {article} other {articles}}",
+ "pwlQEY": {
+ "defaultMessage": "Display Name",
"description": ""
},
- "ZAs170": {
- "defaultMessage": "Profile",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "DMlmcU": {
- "defaultMessage": "Free Trial",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "EQeKnO": {
- "defaultMessage": "Manage Invitation",
- "description": "src/views/Circle/Settings/index.tsx"
- },
- "KLQ1/z": {
- "defaultMessage": "Circle successfully created",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "pzTOmv": {
+ "defaultMessage": "Followers",
+ "description": ""
},
- "mjMpv4": {
- "defaultMessage": "Circle Edited",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "q+N5Wd": {
+ "defaultMessage": "Manage Circle",
+ "description": "src/views/Circle/Profile/DropdownActions/index.tsx"
},
- "ei+kyp": {
- "defaultMessage": "Name of the Circle",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "q9oMKE": {
+ "defaultMessage": "Circle Name",
+ "description": ""
},
- "tW3hM/": {
- "defaultMessage": "Description of the Circle",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qPPrzm": {
+ "defaultMessage": " supported your article ",
+ "description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
- "CwWLOr": {
- "defaultMessage": "Enter the name of your Circle",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qQmSxu": {
+ "defaultMessage": "Airdrop registration completed. Your NFT will be revealed on November 12. Confirm your ETH wallet address:",
+ "description": "src/components/Notice/CryptoNotice/CryptoWalletAirdropNotice.tsx"
},
- "QUqfbW": {
- "defaultMessage": "Describe more about your Circle",
- "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
+ "qYzBk8": {
+ "defaultMessage": " unsubscribed your circle",
+ "description": "src/components/Notice/CircleNotice/CircleNewUserNotice.tsx"
},
- "JXdbo8": {
- "defaultMessage": "Done",
- "description": ""
+ "qlki7w": {
+ "defaultMessage": "Remove Article",
+ "description": "src/components/ArticleDigest/DropdownActions/RemoveTagButton.tsx"
},
- "q9oMKE": {
- "defaultMessage": "Circle Name",
+ "qswU4E": {
+ "defaultMessage": "Email will not be used as a login but only as a contact channel.",
"description": ""
},
- "QZXKhG": {
- "defaultMessage": "Set the Circle URL (cannot be modified after creation)",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
- },
- "6BXcdo": {
- "defaultMessage": "Set threshold for circle (per month)",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
+ "qyzJxi": {
+ "defaultMessage": "Logbook 1.0",
+ "description": "src/components/UserProfile/DropdownActions/index.tsx"
},
- "VwuiYK": {
- "defaultMessage": "This URL name has already been used, try another one",
- "description": "src/components/Forms/CreateCircleForm/Init.tsx"
+ "rBjwQy": {
+ "defaultMessage": "Weibo",
+ "description": "src/components/Share/Buttons/Weibo.tsx"
},
- "gMZZ9I": {
- "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
+ "rXnmeE": {
+ "defaultMessage": "Confirm and Send",
"description": ""
},
- "+7SAix": {
- "defaultMessage": "Must be between 2-12 characters long.",
- "description": ""
+ "reOeq5": {
+ "defaultMessage": "You have created your personal creative space. Publish your first work!",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "eov+J2": {
- "defaultMessage": "Custom URL Name",
- "description": ""
+ "rf0ew3": {
+ "defaultMessage": "Come build a Circle and call on your supporters to join you!",
+ "description": "src/components/UserProfile/CircleWidget/index.tsx"
},
- "8KFsZN": {
- "defaultMessage": "Read Counts",
+ "rfz/fN": {
+ "defaultMessage": "Recommended size: 1600px x 900px",
"description": ""
},
- "LOefol": {
- "defaultMessage": "Paywalled",
- "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
- },
- "/podGX": {
- "defaultMessage": "Public",
- "description": "src/views/Circle/Analytics/ContentAnalytics/ContentTabs/index.tsx"
+ "rs0YS2": {
+ "defaultMessage": "Account Banned",
+ "description": "src/components/UserProfile/index.tsx"
},
- "mCAIcg": {
- "defaultMessage": "Hottest",
- "description": "src/views/Circle/Analytics/ContentAnalytics/index.tsx"
+ "sPgUkN": {
+ "defaultMessage": "This Month",
+ "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
- "lNjDPr": {
- "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"
+ "skbUBl": {
+ "defaultMessage": "Log in",
+ "description": "src/components/Buttons/Login/index.tsx"
},
- "RxiHr/": {
- "defaultMessage": "friends have not accepted your invitations.",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
+ "sncOwi": {
+ "defaultMessage": " mentioned you in an article",
+ "description": "src/components/Notice/ArticleNotice/ArticleMentionedYouNotice.tsx"
},
- "b8ogKp": {
- "defaultMessage": "Add Invitation",
- "description": "src/views/Circle/Settings/ManageInvitation/AddButton/index.tsx"
+ "stjoBH": {
+ "defaultMessage": "Now, go like the authors you support! Your Likes will become their income",
+ "description": "src/components/Forms/EmailSignUpForm/Complete.tsx"
},
- "FmWYRt": {
- "defaultMessage": "Free trial period",
+ "sy+pv5": {
+ "defaultMessage": "Email",
"description": ""
},
- "Bc20la": {
- "defaultMessage": "days",
- "description": ""
+ "t7ah39": {
+ "defaultMessage": " just became the maintainer of a tag your article is in. Check out more articles under this tag",
+ "description": "src/components/Notice/TagNotice/TagAdoptionNotice.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"
+ "t8/r8X": {
+ "defaultMessage": "Continue with Wallet",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "rXnmeE": {
- "defaultMessage": "Confirm and Send",
- "description": ""
+ "tQsujN": {
+ "defaultMessage": " replied to topics and mentioned you ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "ptqBN1": {
- "defaultMessage": "Not Now",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
+ "tW3hM/": {
+ "defaultMessage": "Description of the Circle",
+ "description": "src/components/Forms/CreateCircleForm/Profile.tsx"
},
"tzq2+W": {
"defaultMessage": "Send",
"description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/PreSend.tsx"
},
- "fWDtpq": {
- "defaultMessage": "Pending",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
- },
- "JpS59y": {
- "defaultMessage": "Accepted",
- "description": "src/views/Circle/Settings/ManageInvitation/Invites/index.tsx"
+ "u5aHb4": {
+ "defaultMessage": "Copy Link",
+ "description": ""
},
- "Bjdw71": {
- "defaultMessage": "",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uIdMon": {
+ "defaultMessage": "Are you sure you want to archive the article?",
+ "description": "src/components/ArticleDigest/DropdownActions/ArchiveArticle/Dialog.tsx"
},
- "xWZr13": {
- "defaultMessage": "{follower, plural, =1 {follower} other {followers}}",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uVCg1l": {
+ "defaultMessage": "Explore Matters",
+ "description": ""
},
- "GugBCe": {
- "defaultMessage": "New Followers This Month",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uqmi/b": {
+ "defaultMessage": " pinned your comment on ",
+ "description": "src/components/Notice/CommentNotice/CommentPinnedNotice.tsx"
},
- "MDNaxs": {
- "defaultMessage": "",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uuEGON": {
+ "defaultMessage": " posted and replied to topics and mentioned you ",
+ "description": "src/components/Notice/CircleNotice/CircleNewDiscussionComments.tsx"
},
- "zKOr2x": {
- "defaultMessage": "Conversion Rate of Followers",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "uw32VR": {
+ "defaultMessage": "tutorial",
+ "description": ""
},
- "AYTnjk": {
- "defaultMessage": "Followers",
- "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ "v6YjIn": {
+ "defaultMessage": "Account",
+ "description": "src/components/Forms/WalletAuthForm/Select.tsx"
},
- "sPgUkN": {
- "defaultMessage": "This Month",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "vAc1Bw": {
+ "defaultMessage": "Block User",
+ "description": ""
},
- "Fe682o": {
- "defaultMessage": "Next Month (Estimation)",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "vH8sCb": {
+ "defaultMessage": "Circle",
+ "description": ""
},
- "L4NXXh": {
- "defaultMessage": "Total",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "wEQDC6": {
+ "defaultMessage": "Edit",
+ "description": ""
},
- "d4waan": {
- "defaultMessage": "Income",
- "description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
+ "wSEOxH": {
+ "defaultMessage": "Contact Channel",
+ "description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
- "6OBAOi": {
- "defaultMessage": "",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wXzTZ0": {
+ "defaultMessage": "Enter the name of your Circle",
+ "description": ""
},
- "zxy15q": {
- "defaultMessage": "{subscriber, plural, =1 {subscriber} other {subscribers}}",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wbcwKd": {
+ "defaultMessage": "View All",
+ "description": ""
},
- "TSDiqB": {
- "defaultMessage": "Subscribers",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "wqaNK4": {
+ "defaultMessage": " in your circle ",
+ "description": ""
},
- "XHMco9": {
- "defaultMessage": "",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "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"
},
- "1qQzV0": {
- "defaultMessage": "Invitees",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xWZr13": {
+ "defaultMessage": "{follower, plural, =1 {follower} other {followers}}",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
},
- "WpvsPu": {
- "defaultMessage": "Subscribe",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xiKjd/": {
+ "defaultMessage": "Continue with Email",
+ "description": "src/components/Forms/SelectAuthMethodForm/index.tsx"
},
- "SNh1n0": {
- "defaultMessage": "View Members",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xmcVZ0": {
+ "defaultMessage": "Search",
+ "description": ""
},
- "2CqWQE": {
- "defaultMessage": "Total",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "xwj01D": {
+ "defaultMessage": " invites you to become a collaborator",
+ "description": "src/components/Notice/TagNotice/TagAddEditorNotice.tsx"
},
"y0b6Kp": {
"defaultMessage": "Pay",
"description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
},
- "L0J61B": {
- "defaultMessage": "Free",
- "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
+ "y1Z3or": {
+ "defaultMessage": "Language",
+ "description": ""
},
- "SdXoXI": {
- "defaultMessage": "Invitations have been sent. You can check invitation status on the invitation management page.",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
+ "ySGgTo": {
+ "defaultMessage": "Add Articles into Featured",
+ "description": "src/views/TagDetail/DropdownActions/index.tsx"
},
- "OIj8pQ": {
- "defaultMessage": "Invitation Sent",
- "description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
+ "yZfKI4": {
+ "defaultMessage": "discussion and mentioned you",
+ "description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
- "lIir/P": {
- "defaultMessage": "I see",
+ "zKOr2x": {
+ "defaultMessage": "Conversion Rate of Followers",
+ "description": "src/views/Circle/Analytics/FollowerAnalytics/index.tsx"
+ },
+ "zQvVDJ": {
+ "defaultMessage": "All",
"description": ""
},
- "2uwwz+": {
- "defaultMessage": "Accumulated read time indicates the total time length that registered users read.",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zb8Kx1": {
+ "defaultMessage": "Announcement, reminder, chattering..."
},
- "Z6cII7": {
- "defaultMessage": "Accumulated Read Time",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zxlwbc": {
+ "defaultMessage": "Waiting ...",
+ "description": "src/components/Dialogs/RssFeedDialog/Content.tsx"
},
- "DXJ8ys": {
- "defaultMessage": "Read counts indicates how many registered users read.",
- "description": "src/components/Dialogs/HelpDialog/index.tsx"
+ "zxy15q": {
+ "defaultMessage": "{subscriber, plural, =1 {subscriber} other {subscribers}}",
+ "description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
}
}
+
From 0fbf7c65c07458aad79f3a63c4e31ed6c04c6465 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Wed, 12 Apr 2023 17:30:29 +0700
Subject: [PATCH 86/92] fix(i18n): add missing translations
---
src/common/utils/form/validate.ts | 34 ++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/src/common/utils/form/validate.ts b/src/common/utils/form/validate.ts
index 2d50e1f129..b326d245c7 100644
--- a/src/common/utils/form/validate.ts
+++ b/src/common/utils/form/validate.ts
@@ -38,6 +38,7 @@ export const validateTagName = (value: string, lang: Language) => {
return translate({
zh_hant: '不支持單獨使用標點符號',
zh_hans: '不支持单独使用标点符号',
+ en: 'Not support using punctuation marks alone.',
lang,
})
}
@@ -105,11 +106,15 @@ 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,
})
}
@@ -118,6 +123,7 @@ export const validateUserName = (value: string, lang: Language) => {
return translate({
zh_hant: '輸入字數過長,僅供輸入 4-15 個字元',
zh_hans: '输入字数过长,仅供输入 4-15 个字符',
+ en,
lang,
})
}
@@ -126,6 +132,7 @@ export const validateUserName = (value: string, lang: Language) => {
return translate({
zh_hant: '不支持單獨使用標點符號',
zh_hans: '不支持单独使用标点符号',
+ en,
lang,
})
}
@@ -163,6 +170,7 @@ export const validateDisplayName = (
return translate({
zh_hant: '輸入字數過短,僅供輸入 2-20 個字元',
zh_hans: '输入字数过短,仅供输入 2-20 个字符',
+ en: 'Must be between 2-20 characters long.',
lang,
})
}
@@ -171,6 +179,7 @@ export const validateDisplayName = (
return translate({
zh_hant: '輸入字數過長,僅供輸入 2-20 個字元',
zh_hans: '输入字数过长,仅供输入 2-20 个字符',
+ en: 'Must be between 2-20 characters long.',
lang,
})
}
@@ -180,6 +189,7 @@ export const validateDisplayName = (
return translate({
zh_hant: `不能使用「${RESERVED_NAMES[invalidNameIndex]}」`,
zh_hans: `不能使用 “${RESERVED_NAMES[invalidNameIndex]}”`,
+ en: `Cannot use "${RESERVED_NAMES[invalidNameIndex]}"`,
lang,
})
}
@@ -188,6 +198,7 @@ export const validateDisplayName = (
return translate({
zh_hant: '不支持單獨使用標點符號',
zh_hans: '不支持单独使用标点符号',
+ en: 'Not support using punctuation marks alone.',
lang,
})
}
@@ -200,6 +211,7 @@ export const validateDescription = (value: string, lang: Language) => {
return translate({
zh_hant: `已超過 200 字,目前 ${value.length} 字`,
zh_hans: `已超过 200 字,目前 ${value.length} 字`,
+ en: 'Maximum 200 characters, current ${value.length} characters.',
lang,
})
}
@@ -212,6 +224,7 @@ export const validateSupportWords = (value: string, lang: Language) => {
return translate({
zh_hant: `已超過 140 字,目前 ${value.length} 字`,
zh_hans: `已超过 140 字,目前 ${value.length} 字`,
+ en: 'Maximum 140 characters, current ${value.length} characters.',
lang,
})
}
@@ -220,7 +233,12 @@ export const validateSupportWords = (value: string, lang: Language) => {
export const validateToS = (value: boolean, lang: Language) => {
if (value === false) {
- return translate({ zh_hant: '請勾選', zh_hans: '请勾选', lang })
+ return translate({
+ zh_hant: '請勾選',
+ zh_hans: '请勾选',
+ en: 'Please check',
+ lang,
+ })
}
}
@@ -243,6 +261,7 @@ export const validateCircleName = (value: string, lang: Language) => {
return translate({
zh_hant: '輸入字數過短,僅供輸入 2-20 個字元',
zh_hans: '输入字数过短,仅供输入 2-20 个字符',
+ en: 'Must be between 2-20 characters long.',
lang,
})
}
@@ -251,6 +270,7 @@ export const validateCircleName = (value: string, lang: Language) => {
return translate({
zh_hant: '輸入字數過長,僅供輸入 2-20 個字元',
zh_hans: '输入字数过长,仅供输入 2-20 个字符',
+ en: 'Must be between 2-20 characters long.',
lang,
})
}
@@ -260,6 +280,7 @@ export const validateCircleName = (value: string, lang: Language) => {
return translate({
zh_hant: `不能使用「${RESERVED_CIRCLE_NAMES[invalidNameIndex]}」`,
zh_hans: `不能使用 “${RESERVED_CIRCLE_NAMES[invalidNameIndex]}”`,
+ en: `"${RESERVED_CIRCLE_NAMES[invalidNameIndex]}" is invalid.`,
lang,
})
}
@@ -268,6 +289,7 @@ export const validateCircleName = (value: string, lang: Language) => {
return translate({
zh_hant: '不支持單獨使用標點符號',
zh_hans: '不支持单独使用标点符号',
+ en: 'Not support using punctuation marks alone.',
lang,
})
}
@@ -289,6 +311,7 @@ export const validateCircleDisplayName = (value: string, lang: Language) => {
return translate({
zh_hant: '輸入字數過短,僅供輸入 2-12 個字元',
zh_hans: '输入字数过短,仅供输入 2-12 個字符',
+ en: 'Must be between 2-12 characters long.',
lang,
})
}
@@ -297,6 +320,7 @@ export const validateCircleDisplayName = (value: string, lang: Language) => {
return translate({
zh_hant: '輸入字數過長,僅供輸入 2-12 個字元',
zh_hans: '输入字数过长,仅供输入 2-12 個字符',
+ en: 'Must be between 2-12 characters long.',
lang,
})
}
@@ -306,6 +330,7 @@ export const validateCircleDisplayName = (value: string, lang: Language) => {
return translate({
zh_hant: `不能使用「${RESERVED_NAMES[invalidNameIndex]}」`,
zh_hans: `不能使用 “${RESERVED_NAMES[invalidNameIndex]}”`,
+ en: `"${RESERVED_NAMES[invalidNameIndex]}" is invalid.`,
lang,
})
}
@@ -314,6 +339,7 @@ export const validateCircleDisplayName = (value: string, lang: Language) => {
return translate({
zh_hant: '不支持單獨使用標點符號',
zh_hans: '不支持单独使用标点符号',
+ en: 'Not support using punctuation marks alone.',
lang,
})
}
@@ -328,6 +354,7 @@ export const validateCircleAmount = (value: number, lang: Language) => {
return translate({
zh_hant: `最小金額爲 HKD ${PAYMENT_MINIMAL_CIRCLE_AMOUNT.HKD}`,
zh_hans: `最小金额为 HKD ${PAYMENT_MINIMAL_CIRCLE_AMOUNT.HKD}`,
+ en: `Minimum amount is HKD ${PAYMENT_MINIMAL_CIRCLE_AMOUNT.HKD}`,
lang,
})
}
@@ -336,6 +363,7 @@ export const validateCircleAmount = (value: number, lang: Language) => {
return translate({
zh_hant: `最大金額爲 HKD ${PAYMENT_MAXIMUM_CIRCLE_AMOUNT.HKD}`,
zh_hans: `最大金额为 HKD ${PAYMENT_MAXIMUM_CIRCLE_AMOUNT.HKD}`,
+ en: `Maximum amount is HKD ${PAYMENT_MAXIMUM_CIRCLE_AMOUNT.HKD}`,
lang,
})
}
@@ -355,6 +383,7 @@ export const validateAmount = (value: number, lang: Language) => {
return translate({
zh_hant: `最小储值金額爲 HKD ${PAYMENT_MINIMAL_ADD_CREDIT_AMOUNT.HKD}`,
zh_hans: `最小储值金额为 HKD ${PAYMENT_MINIMAL_ADD_CREDIT_AMOUNT.HKD}`,
+ en: `Minimum amount is HKD ${PAYMENT_MINIMAL_ADD_CREDIT_AMOUNT.HKD}`,
lang,
})
}
@@ -407,6 +436,7 @@ export const validatePayoutAmount = ({
return translate({
zh_hant: `最少提現金額爲 HKD ${min}`,
zh_hans: `最少提现金額爲 HKD ${min}`,
+ en: `Minimum amount is HKD ${min}`,
lang,
})
}
@@ -415,6 +445,7 @@ export const validatePayoutAmount = ({
return translate({
zh_hant: `最高提現金額爲 HKD ${max}`,
zh_hans: `最高提现金額爲 HKD ${max}`,
+ en: `Maximum amount is HKD ${max}`,
lang,
})
}
@@ -425,6 +456,7 @@ export const validateCurrency = (value: string, lang: Language) => {
return translate({
zh_hant: '請選擇一種幣別',
zh_hans: '请选择一种币别',
+ en: 'Please select a currency',
lang,
})
}
From 887daa15c32b586dbeb0795c3de603166bea5983 Mon Sep 17 00:00:00 2001
From: Matty <98379126+matters-tech@users.noreply.github.com>
Date: Thu, 13 Apr 2023 00:38:26 +0700
Subject: [PATCH 87/92] New translations default.json (Chinese Simplified)
---
lang/zh-Hans.json | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json
index 19a81f689d..dd9dea4570 100644
--- a/lang/zh-Hans.json
+++ b/lang/zh-Hans.json
@@ -96,7 +96,7 @@
"description": ""
},
"3WKlPP": {
- "defaultMessage": "commented in",
+ "defaultMessage": "在围炉 ",
"description": ""
},
"3kbIhS": {
@@ -184,7 +184,7 @@
"description": ""
},
"8cv9D4": {
- "defaultMessage": "Next Step",
+ "defaultMessage": "下一步",
"description": ""
},
"8xPi0N": {
@@ -212,7 +212,7 @@
"description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
},
"A41QIy": {
- "defaultMessage": "Enter Password",
+ "defaultMessage": "输入密码",
"description": ""
},
"A7ugfn": {
@@ -256,7 +256,7 @@
"description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
"CBDDR5": {
- "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
+ "defaultMessage": "2-20 个字符,仅支持英文小写字母、数字或下划线",
"description": ""
},
"Cdkhl8": {
@@ -568,7 +568,7 @@
"description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
},
"SENRqu": {
- "defaultMessage": "Help",
+ "defaultMessage": "說明",
"description": ""
},
"SNh1n0": {
@@ -580,7 +580,7 @@
"description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
},
"Seanpx": {
- "defaultMessage": "Required",
+ "defaultMessage": "必填欄位",
"description": ""
},
"Szd1tH": {
@@ -692,7 +692,7 @@
"description": ""
},
"Xz/AHp": {
- "defaultMessage": "broadcast and mentioned you",
+ "defaultMessage": " 廣播提及你",
"description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
"YIes/F": {
@@ -952,7 +952,7 @@
"description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx"
},
"ldNgRA": {
- "defaultMessage": "Display name, can be changed later",
+ "defaultMessage": "你的站內暱稱,之後可以修改",
"description": "src/components/Forms/EmailSignUpForm/Init.tsx"
},
"lhaIoi": {
@@ -1100,7 +1100,7 @@
"description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
"skbUBl": {
- "defaultMessage": "Log in",
+ "defaultMessage": "登入",
"description": "src/components/Buttons/Login/index.tsx"
},
"sncOwi": {
@@ -1180,7 +1180,7 @@
"description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
"wXzTZ0": {
- "defaultMessage": "Enter the name of your Circle",
+ "defaultMessage": "給圍爐取一個吸引人的名字吧",
"description": ""
},
"wbcwKd": {
@@ -1224,7 +1224,7 @@
"description": "src/views/TagDetail/DropdownActions/index.tsx"
},
"yZfKI4": {
- "defaultMessage": "discussion and mentioned you",
+ "defaultMessage": " 眾聊提及你",
"description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
"zKOr2x": {
From a588b06e5e14ab05318381f2e0ab23decb21e90a Mon Sep 17 00:00:00 2001
From: Matty <98379126+matters-tech@users.noreply.github.com>
Date: Thu, 13 Apr 2023 00:38:27 +0700
Subject: [PATCH 88/92] New translations default.json (Chinese Traditional)
---
lang/zh-Hant.json | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/lang/zh-Hant.json b/lang/zh-Hant.json
index 773b50877b..a410f380cf 100644
--- a/lang/zh-Hant.json
+++ b/lang/zh-Hant.json
@@ -96,7 +96,7 @@
"description": ""
},
"3WKlPP": {
- "defaultMessage": "commented in",
+ "defaultMessage": "在圍爐 ",
"description": ""
},
"3kbIhS": {
@@ -184,7 +184,7 @@
"description": ""
},
"8cv9D4": {
- "defaultMessage": "Next Step",
+ "defaultMessage": "下一步",
"description": ""
},
"8xPi0N": {
@@ -212,7 +212,7 @@
"description": "src/components/UserProfile/DropdownActions/EditProfileDialog/NFTCollection/index.tsx"
},
"A41QIy": {
- "defaultMessage": "Enter Password",
+ "defaultMessage": "輸入密碼",
"description": ""
},
"A7ugfn": {
@@ -256,7 +256,7 @@
"description": "src/components/Notice/TransactionNotice/PaymentReceivedDonationNotice.tsx"
},
"CBDDR5": {
- "defaultMessage": "Must be between 2-20 characters long. Only lowercase letters, numbers and underline are allowed.",
+ "defaultMessage": "2-20 個字元,僅支持英文小写字母、數字或下劃線",
"description": ""
},
"Cdkhl8": {
@@ -568,7 +568,7 @@
"description": "src/views/Circle/Settings/ManageInvitation/Invites/Accepted/index.tsx"
},
"SENRqu": {
- "defaultMessage": "Help",
+ "defaultMessage": "说明",
"description": ""
},
"SNh1n0": {
@@ -580,7 +580,7 @@
"description": "src/views/Circle/Settings/ManageInvitation/AddInvitationDialog/Sent.tsx"
},
"Seanpx": {
- "defaultMessage": "Required",
+ "defaultMessage": "必填栏位",
"description": ""
},
"Szd1tH": {
@@ -692,7 +692,7 @@
"description": ""
},
"Xz/AHp": {
- "defaultMessage": "broadcast and mentioned you",
+ "defaultMessage": " 广播提及你",
"description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
"YIes/F": {
@@ -952,7 +952,7 @@
"description": "src/views/Circle/Settings/ManageInvitation/Invites/Pending/index.tsx"
},
"ldNgRA": {
- "defaultMessage": "Display name, can be changed later",
+ "defaultMessage": "你的站内暱称,之后可以修改",
"description": "src/components/Forms/EmailSignUpForm/Init.tsx"
},
"lhaIoi": {
@@ -1100,7 +1100,7 @@
"description": "src/views/Circle/Analytics/IncomeAnalytics/index.tsx"
},
"skbUBl": {
- "defaultMessage": "Log in",
+ "defaultMessage": "登录",
"description": "src/components/Buttons/Login/index.tsx"
},
"sncOwi": {
@@ -1180,7 +1180,7 @@
"description": "src/components/Forms/WalletAuthForm/Connect.tsx"
},
"wXzTZ0": {
- "defaultMessage": "Enter the name of your Circle",
+ "defaultMessage": "给围炉取一个吸引人的名字吧",
"description": ""
},
"wbcwKd": {
@@ -1224,7 +1224,7 @@
"description": "src/views/TagDetail/DropdownActions/index.tsx"
},
"yZfKI4": {
- "defaultMessage": "discussion and mentioned you",
+ "defaultMessage": " 众聊提及你",
"description": "src/components/Notice/CommentNotice/CommentMentionedYouNotice.tsx"
},
"zKOr2x": {
From 99fec12739d255b57f12877d9fb2a8e9afc08426 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Thu, 13 Apr 2023 00:42:45 +0700
Subject: [PATCH 89/92] fix(i18n): fix translations
---
lang/en.json | 1 -
lang/zh-Hans.json | 1 -
lang/zh-Hant.json | 1 -
src/common/enums/text.ts | 14 +++++++-------
4 files changed, 7 insertions(+), 10 deletions(-)
diff --git a/lang/en.json b/lang/en.json
index e33631e4be..ab74c5674a 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -1247,4 +1247,3 @@
"description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
}
}
-
diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json
index 19a81f689d..8f47022bea 100644
--- a/lang/zh-Hans.json
+++ b/lang/zh-Hans.json
@@ -1247,4 +1247,3 @@
"description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
}
}
-
diff --git a/lang/zh-Hant.json b/lang/zh-Hant.json
index 773b50877b..8fae601fc2 100644
--- a/lang/zh-Hant.json
+++ b/lang/zh-Hant.json
@@ -1247,4 +1247,3 @@
"description": "src/views/Circle/Analytics/SubscriberAnalytics/index.tsx"
}
}
-
diff --git a/src/common/enums/text.ts b/src/common/enums/text.ts
index 1c365f6c50..860c2d0a23 100644
--- a/src/common/enums/text.ts
+++ b/src/common/enums/text.ts
@@ -121,8 +121,8 @@ export const TEXT = {
enterPaymentPointer: '請輸入地址',
enterRegisteredEmail: '請輸入你的註冊電子信箱',
enterUserDescription: '請輸入個人簡介',
- enterUserName: '請輸入 Matters ID',
- enterUserNameAgain: '請再次輸入 Matters ID',
+ enterUserName: '請輸入新的 Matters ID',
+ enterUserNameAgain: '請再次輸入新的 Matters ID',
enterVerificationCode: '請輸入驗證碼',
ENTITY_NOT_FOUND: '實體不存在',
expand: '展開',
@@ -165,7 +165,7 @@ export const TEXT = {
hintAddCircleInvitee: '添加站內或站外朋友加入圍爐',
hintCircleAddArticles: '將公開作品加入圍爐,成為永久收費作品。',
hintCircleDisplayName: '2-12 個字元',
- hintCircleName: '2-20 個字元,僅支持英文小写字母、數字或下劃線',
+ hintCircleName: '2-20 個字元,僅支持英文小寫字母、數字或下劃線',
hintDescription: '建議 50 字以內,最長 200 字',
hintDisplayName: '2-20 個字元',
hintEditCollection: '關聯自己或他人的作品,幫助讀者更好地發現內容。',
@@ -173,7 +173,7 @@ export const TEXT = {
hintPaymentPassword: '輸入六位數字交易密碼',
hintPaymentPointer: '錢包地址以“$”開頭',
hintTerm: '我們的用戶協議和隱私政策發生了更改,請閱讀並同意後繼續使用。',
- hintUserName: '4-15 個字元,僅支持英文小写字母、數字或下劃線',
+ hintUserName: '4-15 個字元,僅支持英文小寫字母、數字或下劃線',
hintVerificationCode: '驗證碼有效期 20 分鐘',
history: '足跡',
hkd: '港幣',
@@ -531,8 +531,8 @@ export const TEXT = {
enterPaymentPointer: '请输入地址',
enterRegisteredEmail: '请输入你的注册邮箱',
enterUserDescription: '请输入个人简介',
- enterUserName: '请输入新 Matters ID',
- enterUserNameAgain: '请再次输入新 Matters ID',
+ enterUserName: '请输入新的 Matters ID',
+ enterUserNameAgain: '请再次输入新的 Matters ID',
enterVerificationCode: '请输入验证码',
ENTITY_NOT_FOUND: '实体不存在',
expand: '展开',
@@ -583,7 +583,7 @@ export const TEXT = {
hintPaymentPassword: '输入六位数字交易密码',
hintPaymentPointer: '钱包地址以“$”开头',
hintTerm: '我们的用户协议和隐私政策发生了更改,请阅读并同意后继续使用。',
- hintUserName: '4-15 个字符,仅支持英文小写字母、数字或下划线',
+ hintUserName: '4-15 个字符,仅支持英文小寫字母、数字或下划线',
hintVerificationCode: '验证码有效期 20 分钟',
history: '足迹',
hkd: '港币',
From ee92a87d12621e754f9f5a5bcda08e3bc058661b Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Thu, 13 Apr 2023 01:17:13 +0700
Subject: [PATCH 90/92] fix(ptr): make `` as trigger element
---
src/components/Layout/index.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx
index 1f042021ce..7fdc0ce37a 100644
--- a/src/components/Layout/index.tsx
+++ b/src/components/Layout/index.tsx
@@ -113,12 +113,12 @@ const Main: React.FC> = ({
hasOnboardingTasks: showOnboardingTasks,
})
- usePullToRefresh.Register()
+ usePullToRefresh.Register('#ptr')
usePullToRefresh.Handler(() => window.location.reload())
return (
<>
-
+
{children}
From e1a2a7f351929751af78466cce3ade49876c1b70 Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Thu, 13 Apr 2023 10:55:29 +0700
Subject: [PATCH 91/92] chore(release): v4.19.0
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 03766085e3..de3faa6f12 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "matters-web",
- "version": "4.18.0",
+ "version": "4.19.0",
"description": "codebase of Matters' website",
"sideEffects": false,
"author": "Matters ",
From 9b049f7cde7b919a34b497be066913d0c53a734d Mon Sep 17 00:00:00 2001
From: robertu <4065233+robertu7@users.noreply.github.com>
Date: Thu, 13 Apr 2023 13:37:16 +0700
Subject: [PATCH 92/92] fix: fix translations
---
src/common/enums/text.ts | 2 +-
src/components/Dialogs/FingerprintDialog/Content.tsx | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/common/enums/text.ts b/src/common/enums/text.ts
index 860c2d0a23..64140189e8 100644
--- a/src/common/enums/text.ts
+++ b/src/common/enums/text.ts
@@ -583,7 +583,7 @@ export const TEXT = {
hintPaymentPassword: '输入六位数字交易密码',
hintPaymentPointer: '钱包地址以“$”开头',
hintTerm: '我们的用户协议和隐私政策发生了更改,请阅读并同意后继续使用。',
- hintUserName: '4-15 个字符,仅支持英文小寫字母、数字或下划线',
+ hintUserName: '4-15 个字符,仅支持英文小写字母、数字或下划线',
hintVerificationCode: '验证码有效期 20 分钟',
history: '足迹',
hkd: '港币',
diff --git a/src/components/Dialogs/FingerprintDialog/Content.tsx b/src/components/Dialogs/FingerprintDialog/Content.tsx
index bf8acb754c..3201f05cf6 100644
--- a/src/components/Dialogs/FingerprintDialog/Content.tsx
+++ b/src/components/Dialogs/FingerprintDialog/Content.tsx
@@ -241,7 +241,7 @@ const FingerprintDialogContent = ({
) : (
)