diff --git a/web/src/components/ChatBox/ChatMessageList/useChatMessageItemAction.tsx b/web/src/components/ChatBox/ChatMessageList/useChatMessageItemAction.tsx index 847cca8b..fae250f3 100644 --- a/web/src/components/ChatBox/ChatMessageList/useChatMessageItemAction.tsx +++ b/web/src/components/ChatBox/ChatMessageList/useChatMessageItemAction.tsx @@ -11,6 +11,7 @@ import { useGroupInfoContext, useUserInfo, } from 'tailchat-shared'; +import { openReconfirmModalP } from '@/components/Modal'; /** * 消息的会话操作 @@ -23,12 +24,14 @@ export function useChatMessageItemAction( const groupInfo = useGroupInfoContext(); const userInfo = useUserInfo(); - const [, handleRecallMessage] = useAsyncRequest(() => { - return recallMessage(payload._id); + const [, handleRecallMessage] = useAsyncRequest(async () => { + await openReconfirmModalP(); + await recallMessage(payload._id); }, [payload._id]); - const [, handleDeleteMessage] = useAsyncRequest(() => { - return deleteMessage(payload._id); + const [, handleDeleteMessage] = useAsyncRequest(async () => { + await openReconfirmModalP(); + await deleteMessage(payload._id); }, [payload._id]); const isGroupOwner = groupInfo && groupInfo.owner === userInfo?._id; // diff --git a/web/src/components/Modal.tsx b/web/src/components/Modal.tsx index 198fe736..f1d09b10 100644 --- a/web/src/components/Modal.tsx +++ b/web/src/components/Modal.tsx @@ -6,13 +6,14 @@ import _pull from 'lodash/pull'; import _isString from 'lodash/isString'; import _noop from 'lodash/noop'; import { PortalAdd, PortalRemove } from './Portal'; -import { Typography } from 'antd'; +import { Button, Typography } from 'antd'; import { Icon } from '@/components/Icon'; import { CSSTransition } from 'react-transition-group'; import clsx from 'clsx'; import { useIsMobile } from '@/hooks/useIsMobile'; import { stopPropagation } from '@/utils/dom-helper'; import { ErrorBoundary } from './ErrorBoundary'; +import { t } from 'tailchat-shared'; import './Modal.less'; @@ -155,6 +156,55 @@ export function openModal( return key; } +interface OpenReconfirmModalProps { + onConfirm: () => void; + onCancel?: () => void; +} + +/** + * 打开再次确认操作modal + */ +export function openReconfirmModal(props: OpenReconfirmModalProps) { + const key = openModal( + +

{t('该操作无法被撤回')}

+
+ + +
+
+ ); +} +/** + * 打开再次确认操作modal(Promise版本) + * TODO: 需要检查一下持久pending的promise会不会导致内存泄露 + */ +export function openReconfirmModalP( + props?: Omit +) { + return new Promise((resolve) => { + openReconfirmModal({ + ...props, + onConfirm: resolve, + }); + }); +} + /** * 获取modal上下文 */