diff --git a/web/src/components/MemoActionMenu.tsx b/web/src/components/MemoActionMenu.tsx index 9d99b364..673f049c 100644 --- a/web/src/components/MemoActionMenu.tsx +++ b/web/src/components/MemoActionMenu.tsx @@ -101,7 +101,7 @@ const MemoActionMenu = (props: Props) => { {t("common.edit")} - showShareMemoDialog(memo)}> + showShareMemoDialog(memo.id)}> {t("common.share")} diff --git a/web/src/components/ShareMemoDialog.tsx b/web/src/components/ShareMemoDialog.tsx index b8d48778..9e84b9f8 100644 --- a/web/src/components/ShareMemoDialog.tsx +++ b/web/src/components/ShareMemoDialog.tsx @@ -1,33 +1,40 @@ -import { Button, IconButton } from "@mui/joy"; +import { Button, IconButton, Select, Option } from "@mui/joy"; import copy from "copy-to-clipboard"; import React, { useEffect, useRef } from "react"; import { toast } from "react-hot-toast"; import { getDateTimeString } from "@/helpers/datetime"; import { downloadFileFromUrl } from "@/helpers/utils"; +import useCurrentUser from "@/hooks/useCurrentUser"; import useLoading from "@/hooks/useLoading"; import toImage from "@/labs/html2image"; -import { useUserStore, extractUsernameFromName } from "@/store/v1"; -import { Memo, Visibility } from "@/types/proto/api/v2/memo_service"; +import { useUserStore, extractUsernameFromName, useMemoStore } from "@/store/v1"; +import { Visibility } from "@/types/proto/api/v2/memo_service"; import { useTranslate } from "@/utils/i18n"; +import { convertVisibilityToString } from "@/utils/memo"; import { generateDialog } from "./Dialog"; import Icon from "./Icon"; import MemoContent from "./MemoContent"; import MemoResourceListView from "./MemoResourceListView"; import UserAvatar from "./UserAvatar"; +import VisibilityIcon from "./VisibilityIcon"; import "@/less/share-memo-dialog.less"; interface Props extends DialogProps { - memo: Memo; + memoId: number; } const ShareMemoDialog: React.FC = (props: Props) => { - const { memo, destroy } = props; + const { memoId, destroy } = props; const t = useTranslate(); const userStore = useUserStore(); const downloadingImageState = useLoading(false); const loadingState = useLoading(); const memoElRef = useRef(null); + const memoStore = useMemoStore(); + const memo = memoStore.getMemoById(memoId); const user = userStore.getUserByUsername(extractUsernameFromName(memo.creator)); + const currentUser = useCurrentUser(); + const readonly = memo?.creatorId !== currentUser?.id; useEffect(() => { (async () => { @@ -75,6 +82,20 @@ const ShareMemoDialog: React.FC = (props: Props) => { } }; + const handleMemoVisibilityOptionChanged = async (visibility: Visibility) => { + const updatedMemo = await memoStore.updateMemo( + { + id: memo.id, + visibility: visibility, + }, + ["visibility"], + ); + + if (updatedMemo.visibility == visibility) { + toast.success(t("common.changed")); + } + }; + if (loadingState.isLoading) { return null; } @@ -88,23 +109,44 @@ const ShareMemoDialog: React.FC = (props: Props) => {
-
- - - +
+
+ + + +
+ {!readonly && ( + + )}
= (props: Props) => { ); }; -export default function showShareMemoDialog(memo: Memo): void { +export default function showShareMemoDialog(memoId: number): void { generateDialog( { className: "share-memo-dialog", dialogName: "share-memo-dialog", }, ShareMemoDialog, - { memo }, + { memoId }, ); } diff --git a/web/src/pages/MemoDetail.tsx b/web/src/pages/MemoDetail.tsx index b99f403a..1fc7d973 100644 --- a/web/src/pages/MemoDetail.tsx +++ b/web/src/pages/MemoDetail.tsx @@ -180,7 +180,7 @@ const MemoDetail = () => { - showShareMemoDialog(memo)}> + showShareMemoDialog(memo.id)}>