diff --git a/web/src/components/Memo.tsx b/web/src/components/Memo.tsx index bc0c0c59..44395db1 100644 --- a/web/src/components/Memo.tsx +++ b/web/src/components/Memo.tsx @@ -1,16 +1,16 @@ -import { memo, useEffect, useRef, useState } from "react"; -import { indexOf } from "lodash-es"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; +import { indexOf } from "lodash-es"; +import { memo, useEffect, useRef, useState } from "react"; import "dayjs/locale/zh"; import useI18n from "../hooks/useI18n"; import { UNKNOWN_ID } from "../helpers/consts"; -import { DONE_BLOCK_REG, formatMemoContent, IMAGE_URL_REG, TODO_BLOCK_REG } from "../helpers/marked"; +import { DONE_BLOCK_REG, formatMemoContent, TODO_BLOCK_REG } from "../helpers/marked"; import { editorStateService, locationService, memoService, userService } from "../services"; import Icon from "./Icon"; import Only from "./common/OnlyWhen"; import toastHelper from "./Toast"; -import Image from "./Image"; +import MemoResources from "./MemoResources"; import showMemoCardDialog from "./MemoCardDialog"; import showShareMemoImageDialog from "./ShareMemoImageDialog"; import "../less/memo.less"; @@ -46,7 +46,6 @@ const Memo: React.FC = (props: Props) => { const [createdAtStr, setCreatedAtStr] = useState(getFormatedMemoCreatedAtStr(memo.createdTs, locale)); const memoContainerRef = useRef(null); const memoContentContainerRef = useRef(null); - const imageUrls = Array.from(memo.content.match(IMAGE_URL_REG) ?? []).map((s) => s.replace(IMAGE_URL_REG, "$1")); const isVisitorMode = userService.isVisitorMode(); useEffect(() => { @@ -239,13 +238,7 @@ const Memo: React.FC = (props: Props) => { )} - 0}> -
- {imageUrls.map((imgUrl, idx) => ( - - ))} -
-
+ ); }; diff --git a/web/src/components/MemoCardDialog.tsx b/web/src/components/MemoCardDialog.tsx index 4d4e6fff..0c2fae32 100644 --- a/web/src/components/MemoCardDialog.tsx +++ b/web/src/components/MemoCardDialog.tsx @@ -3,13 +3,13 @@ import { editorStateService, memoService, userService } from "../services"; import { useAppSelector } from "../store"; import { UNKNOWN_ID, VISIBILITY_SELECTOR_ITEMS } from "../helpers/consts"; import * as utils from "../helpers/utils"; -import { formatMemoContent, IMAGE_URL_REG, MEMO_LINK_REG, parseHtmlToRawText } from "../helpers/marked"; +import { formatMemoContent, MEMO_LINK_REG, parseHtmlToRawText } from "../helpers/marked"; import Only from "./common/OnlyWhen"; import toastHelper from "./Toast"; import { generateDialog } from "./Dialog"; -import Image from "./Image"; import Icon from "./Icon"; import Selector from "./common/Selector"; +import MemoResources from "./MemoResources"; import showChangeMemoCreatedTsDialog from "./ChangeMemoCreatedTsDialog"; import "../less/memo-card-dialog.less"; @@ -29,7 +29,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")); useEffect(() => { const fetchLinkedMemos = async () => { @@ -167,13 +166,7 @@ const MemoCardDialog: React.FC = (props: Props) => { onClick={handleMemoContentClick} dangerouslySetInnerHTML={{ __html: formatMemoContent(memo.content) }} > - 0}> -
- {imageUrls.map((imgUrl, idx) => ( - - ))} -
-
+
{linkMemos.map((_, idx) => { diff --git a/web/src/components/MemoResources.tsx b/web/src/components/MemoResources.tsx new file mode 100644 index 00000000..4f4f5a7f --- /dev/null +++ b/web/src/components/MemoResources.tsx @@ -0,0 +1,28 @@ +import { IMAGE_URL_REG } from "../helpers/marked"; +import Only from "./common/OnlyWhen"; +import Image from "./Image"; +import "../less/memo-resources.less"; + +interface Props { + className?: string; + memo: Memo; +} + +const MemoResources: React.FC = (props: Props) => { + const { className, memo } = props; + const imageUrls = Array.from(memo.content.match(IMAGE_URL_REG) ?? []).map((s) => s.replace(IMAGE_URL_REG, "$1")); + + return ( +
+ 0}> +
+ {imageUrls.map((imgUrl, idx) => ( + + ))} +
+
+
+ ); +}; + +export default MemoResources; diff --git a/web/src/components/Sidebar.tsx b/web/src/components/Sidebar.tsx index 38c02b29..ea029abb 100644 --- a/web/src/components/Sidebar.tsx +++ b/web/src/components/Sidebar.tsx @@ -35,12 +35,12 @@ const Sidebar = () => { 📅 {t("sidebar.daily-review")} - + diff --git a/web/src/less/memo-card-dialog.less b/web/src/less/memo-card-dialog.less index 0d7464db..c84808d8 100644 --- a/web/src/less/memo-card-dialog.less +++ b/web/src/less/memo-card-dialog.less @@ -61,23 +61,6 @@ > .memo-content-text { @apply w-full text-base; } - - > .images-wrapper { - .flex(row, flex-start, flex-start); - @apply w-full mt-2 overflow-x-auto overflow-y-hidden; - padding-bottom: 2px; - .pretty-scroll-bar(0, 2px); - - > .memo-img { - @apply mr-2 w-auto h-32 shrink-0 grow-0 overflow-y-hidden hover:border-gray-400 last:mr-0; - .hide-scroll-bar(); - - > img { - @apply w-auto rounded-lg; - max-height: 128px; - } - } - } } > .normal-text { diff --git a/web/src/less/memo-editor.less b/web/src/less/memo-editor.less index 7fddae8c..34cda7da 100644 --- a/web/src/less/memo-editor.less +++ b/web/src/less/memo-editor.less @@ -50,7 +50,7 @@ } > .tag-list { - @apply hidden flex-col justify-start items-start absolute top-6 left-0 mt-1 p-1 z-1 rounded w-32 max-h-52 overflow-auto bg-black; + @apply hidden flex-col justify-start items-start absolute top-6 left-0 mt-1 p-1 z-1 rounded w-32 max-h-52 overflow-auto font-mono bg-black; > .item-container { @apply w-full text-white cursor-pointer rounded text-sm leading-6 px-2 hover:bg-gray-700; diff --git a/web/src/less/memo-resources.less b/web/src/less/memo-resources.less new file mode 100644 index 00000000..14783c54 --- /dev/null +++ b/web/src/less/memo-resources.less @@ -0,0 +1,19 @@ +@import "./mixin.less"; + +.resource-wrapper { + @apply w-full flex flex-col justify-start items-start; + + > .images-wrapper { + @apply flex flex-row justify-start items-start mt-2 w-full overflow-x-auto overflow-y-hidden pb-1; + .pretty-scroll-bar(0, 2px); + + > .memo-img { + @apply mr-2 last:mr-0 w-auto h-auto shrink-0 grow-0 overflow-y-hidden; + .hide-scroll-bar(); + + > img { + @apply w-auto max-h-40 rounded-lg; + } + } + } +} diff --git a/web/src/less/memo.less b/web/src/less/memo.less index 7049bcb8..b1000463 100644 --- a/web/src/less/memo.less +++ b/web/src/less/memo.less @@ -140,18 +140,4 @@ } } } - - > .images-wrapper { - @apply flex flex-row justify-start items-start mt-2 w-full overflow-x-auto overflow-y-hidden pb-1; - .pretty-scroll-bar(0, 2px); - - > .memo-img { - @apply mr-2 last:mr-0 w-auto h-auto shrink-0 grow-0 overflow-y-hidden; - .hide-scroll-bar(); - - > img { - @apply w-auto max-h-40 rounded-lg; - } - } - } } diff --git a/web/src/pages/Explore.tsx b/web/src/pages/Explore.tsx index 6c25b124..9959b298 100644 --- a/web/src/pages/Explore.tsx +++ b/web/src/pages/Explore.tsx @@ -5,6 +5,7 @@ import { useAppSelector } from "../store"; import useI18n from "../hooks/useI18n"; import useLoading from "../hooks/useLoading"; import MemoContent from "../components/MemoContent"; +import MemoResources from "../components/MemoResources"; import "../less/explore.less"; interface State { @@ -72,6 +73,7 @@ const Explore = () => { undefined} /> + ); })}