diff --git a/web/src/components/Memo.tsx b/web/src/components/Memo.tsx index 448dcce4..351737c3 100644 --- a/web/src/components/Memo.tsx +++ b/web/src/components/Memo.tsx @@ -60,11 +60,16 @@ const Memo: React.FC = (props: Props) => { }); } + let intervalFlag = -1; if (Date.now() - memo.createdTs < 1000 * 60 * 60 * 24) { - setInterval(() => { + intervalFlag = setInterval(() => { setCreatedAtStr(getFormatedMemoCreatedAtStr(memo.createdTs, locale)); }, 1000 * 1); } + + return () => { + clearInterval(intervalFlag); + }; }, [locale]); const handleShowMemoStoryDialog = () => { diff --git a/web/src/components/MemoCardDialog.tsx b/web/src/components/MemoCardDialog.tsx index 12ba62ed..d65d1882 100644 --- a/web/src/components/MemoCardDialog.tsx +++ b/web/src/components/MemoCardDialog.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useCallback } from "react"; import { editorStateService, memoService, userService } from "../services"; -import { IMAGE_URL_REG, MEMO_LINK_REG, UNKNOWN_ID } from "../helpers/consts"; +import { IMAGE_URL_REG, MEMO_LINK_REG, UNKNOWN_ID, VISIBILITY_SELECTOR_ITEMS } from "../helpers/consts"; import * as utils from "../helpers/utils"; import { formatMemoContent, parseHtmlToRawText } from "../helpers/marked"; import Only from "./common/OnlyWhen"; @@ -27,11 +27,6 @@ const MemoCardDialog: React.FC = (props: Props) => { const [linkMemos, setLinkMemos] = useState([]); const [linkedMemos, setLinkedMemos] = useState([]); const imageUrls = Array.from(memo.content.match(IMAGE_URL_REG) ?? []).map((s) => s.replace(IMAGE_URL_REG, "$1")); - const visibilityList = [ - { text: "PUBLIC", value: "PUBLIC" }, - { text: "PROTECTED", value: "PROTECTED" }, - { text: "PRIVATE", value: "PRIVATE" }, - ]; useEffect(() => { const fetchLinkedMemos = async () => { @@ -132,7 +127,7 @@ const MemoCardDialog: React.FC = (props: Props) => { handleVisibilitySelectorChange(value as Visibility)} /> diff --git a/web/src/components/Settings/PreferencesSection.tsx b/web/src/components/Settings/PreferencesSection.tsx index ca7e6605..d94ed720 100644 --- a/web/src/components/Settings/PreferencesSection.tsx +++ b/web/src/components/Settings/PreferencesSection.tsx @@ -1,5 +1,6 @@ import { globalService, userService } from "../../services"; import { useAppSelector } from "../../store"; +import { VISIBILITY_SELECTOR_ITEMS } from "../../helpers/consts"; import useI18n from "../../hooks/useI18n"; import Selector from "../common/Selector"; import "../../less/settings/preferences-section.less"; @@ -26,12 +27,25 @@ const PreferencesSection: React.FC = () => { await userService.upsertUserSetting("locale", value); }; + const handleDefaultMemoVisibilityChanged = async (value: string) => { + await userService.upsertUserSetting("memoVisibility", value); + }; + return (
+
); }; diff --git a/web/src/helpers/consts.ts b/web/src/helpers/consts.ts index 02ec445f..2af38a03 100644 --- a/web/src/helpers/consts.ts +++ b/web/src/helpers/consts.ts @@ -21,3 +21,9 @@ export const LINK_URL_REG = /\[(.*?)\]\((.+?)\)/g; // linked memo regex export const MEMO_LINK_REG = /@\[(.+?)\]\((.+?)\)/g; + +export const VISIBILITY_SELECTOR_ITEMS = [ + { text: "PUBLIC", value: "PUBLIC" }, + { text: "PROTECTED", value: "PROTECTED" }, + { text: "PRIVATE", value: "PRIVATE" }, +]; diff --git a/web/src/labs/i18n/useI18n.ts b/web/src/labs/i18n/useI18n.ts index b005dd34..0819590b 100644 --- a/web/src/labs/i18n/useI18n.ts +++ b/web/src/labs/i18n/useI18n.ts @@ -3,8 +3,6 @@ import i18nStore from "./i18nStore"; import enLocale from "../../locales/en.json"; import zhLocale from "../../locales/zh.json"; -type Locale = "en" | "zh"; - const resources: Record = { en: enLocale, zh: zhLocale, diff --git a/web/src/locales/en.json b/web/src/locales/en.json index 259c24d6..c82eb5dd 100644 --- a/web/src/locales/en.json +++ b/web/src/locales/en.json @@ -51,6 +51,9 @@ "account-section": { "title": "Account Information" }, + "preference-section": { + "default-memo-visibility": "Default memo visibility" + }, "member-section": { "create-a-member": "Create a member" } diff --git a/web/src/locales/zh.json b/web/src/locales/zh.json index 2bf092ce..ecb3c7e2 100644 --- a/web/src/locales/zh.json +++ b/web/src/locales/zh.json @@ -52,6 +52,9 @@ "account-section": { "title": "账号信息" }, + "preference-section": { + "default-memo-visibility": "默认 Memo 可见性" + }, "member-section": { "create-a-member": "创建成员" } diff --git a/web/src/services/userService.ts b/web/src/services/userService.ts index 706b6ffa..0a1c8917 100644 --- a/web/src/services/userService.ts +++ b/web/src/services/userService.ts @@ -6,6 +6,7 @@ import { setUser, patchUser, setHost, setOwner } from "../store/modules/user"; const defauleSetting: Setting = { locale: "en", + memoVisibility: "PRIVATE", }; export const convertResponseModelUser = (user: User): User => { diff --git a/web/src/types/modules/setting.d.ts b/web/src/types/modules/setting.d.ts index b90e6208..38271afc 100644 --- a/web/src/types/modules/setting.d.ts +++ b/web/src/types/modules/setting.d.ts @@ -1,10 +1,16 @@ interface Setting { - locale: "en" | "zh"; + locale: Locale; + memoVisibility: Visibility; } interface UserLocaleSetting { key: "locale"; - value: "en" | "zh"; + value: Locale; +} + +interface UserMemoVisibilitySetting { + key: "memoVisibility"; + value: Visibility; } type UserSetting = UserLocaleSetting;