diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-config-modal.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-config-modal.tsx index 2411d2baa4..e7ecd2f4ce 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-config-modal.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-config-modal.tsx @@ -14,7 +14,7 @@ import { import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security' import Button from '@/app/components/base/button' import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general' -import ConfirmUi from '@/app/components/base/confirm' +import Confirm from '@/app/components/base/confirm' import { addTracingConfig, removeTracingConfig, updateTracingConfig } from '@/service/apps' import Toast from '@/app/components/base/toast' @@ -276,9 +276,8 @@ const ProviderConfigModal: FC = ({ ) : ( - { title={t('app.deleteAppConfirmTitle')} content={t('app.deleteAppConfirmContent')} isShow={showConfirmDelete} - onClose={() => setShowConfirmDelete(false)} onConfirm={onConfirmDelete} onCancel={() => setShowConfirmDelete(false)} /> diff --git a/web/app/(commonLayout)/datasets/DatasetCard.tsx b/web/app/(commonLayout)/datasets/DatasetCard.tsx index ed8d680c19..096d9d357e 100644 --- a/web/app/(commonLayout)/datasets/DatasetCard.tsx +++ b/web/app/(commonLayout)/datasets/DatasetCard.tsx @@ -219,7 +219,6 @@ const DatasetCard = ({ title={t('dataset.deleteDatasetConfirmTitle')} content={confirmMessage} isShow={showConfirmDelete} - onClose={() => setShowConfirmDelete(false)} onConfirm={onConfirmDelete} onCancel={() => setShowConfirmDelete(false)} /> diff --git a/web/app/components/app-sidebar/app-info.tsx b/web/app/components/app-sidebar/app-info.tsx index 3f52e9d6f5..698846cae5 100644 --- a/web/app/components/app-sidebar/app-info.tsx +++ b/web/app/components/app-sidebar/app-info.tsx @@ -426,7 +426,6 @@ const AppInfo = ({ expand }: IAppInfoProps) => { title={t('app.deleteAppConfirmTitle')} content={t('app.deleteAppConfirmContent')} isShow={showConfirmDelete} - onClose={() => setShowConfirmDelete(false)} onConfirm={onConfirmDelete} onCancel={() => setShowConfirmDelete(false)} /> diff --git a/web/app/components/app/annotation/edit-annotation-modal/index.tsx b/web/app/components/app/annotation/edit-annotation-modal/index.tsx index 548ecb2be3..df80196cf1 100644 --- a/web/app/components/app/annotation/edit-annotation-modal/index.tsx +++ b/web/app/components/app/annotation/edit-annotation-modal/index.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next' import EditItem, { EditItemType } from './edit-item' import Drawer from '@/app/components/base/drawer-plus' import { MessageCheckRemove } from '@/app/components/base/icons/src/vender/line/communication' -import DeleteConfirmModal from '@/app/components/base/modal/delete-confirm-modal' +import Confirm from '@/app/components/base/confirm' import { addAnnotation, editAnnotation } from '@/service/annotation' import Toast from '@/app/components/base/toast' import { useProviderContext } from '@/context/provider-context' @@ -85,19 +85,31 @@ const EditAnnotationModal: FC = ({ maxWidthClassName='!max-w-[480px]' title={t('appAnnotation.editModal.title') as string} body={( -
- handleSave(EditItemType.Query, editedContent)} - /> - handleSave(EditItemType.Answer, editedContent)} - /> +
+
+ handleSave(EditItemType.Query, editedContent)} + /> + handleSave(EditItemType.Answer, editedContent)} + /> + setShowModal(false)} + onConfirm={() => { + onRemove() + setShowModal(false) + onHide() + }} + title={t('appDebug.feature.annotation.removeConfirm')} + /> +
)} foot={ @@ -127,16 +139,6 @@ const EditAnnotationModal: FC = ({
} /> - setShowModal(false)} - onRemove={() => { - onRemove() - setShowModal(false) - onHide() - }} - text={t('appDebug.feature.annotation.removeConfirm') as string} - /> ) diff --git a/web/app/components/app/annotation/remove-annotation-confirm-modal/index.tsx b/web/app/components/app/annotation/remove-annotation-confirm-modal/index.tsx index a9c9d40836..a6ade49a79 100644 --- a/web/app/components/app/annotation/remove-annotation-confirm-modal/index.tsx +++ b/web/app/components/app/annotation/remove-annotation-confirm-modal/index.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import React from 'react' import { useTranslation } from 'react-i18next' -import DeleteConfirmModal from '@/app/components/base/modal/delete-confirm-modal' +import Confirm from '@/app/components/base/confirm' type Props = { isShow: boolean @@ -18,11 +18,11 @@ const RemoveAnnotationConfirmModal: FC = ({ const { t } = useTranslation() return ( - ) } diff --git a/web/app/components/app/annotation/view-annotation-modal/index.tsx b/web/app/components/app/annotation/view-annotation-modal/index.tsx index 3abc477d35..7b96ad134e 100644 --- a/web/app/components/app/annotation/view-annotation-modal/index.tsx +++ b/web/app/components/app/annotation/view-annotation-modal/index.tsx @@ -11,7 +11,7 @@ import HitHistoryNoData from './hit-history-no-data' import cn from '@/utils/classnames' import Drawer from '@/app/components/base/drawer-plus' import { MessageCheckRemove } from '@/app/components/base/icons/src/vender/line/communication' -import DeleteConfirmModal from '@/app/components/base/modal/delete-confirm-modal' +import Confirm from '@/app/components/base/confirm' import TabSlider from '@/app/components/base/tab-slider-plain' import { fetchHitHistoryList } from '@/service/annotation' import { APP_PAGE_LIMIT } from '@/config' @@ -201,8 +201,20 @@ const ViewAnnotationModal: FC = ({ /> } body={( -
- {activeTab === TabType.annotation ? annotationTab : hitHistoryTab} +
+
+ {activeTab === TabType.annotation ? annotationTab : hitHistoryTab} +
+ setShowModal(false)} + onConfirm={async () => { + await onRemove() + setShowModal(false) + onHide() + }} + title={t('appDebug.feature.annotation.removeConfirm')} + />
)} foot={id @@ -220,16 +232,6 @@ const ViewAnnotationModal: FC = ({ ) : undefined} /> - setShowModal(false)} - onRemove={async () => { - await onRemove() - setShowModal(false) - onHide() - }} - text={t('appDebug.feature.annotation.removeConfirm') as string} - />
) diff --git a/web/app/components/app/configuration/config-var/index.tsx b/web/app/components/app/configuration/config-var/index.tsx index 9ef624ed97..82a220c6db 100644 --- a/web/app/components/app/configuration/config-var/index.tsx +++ b/web/app/components/app/configuration/config-var/index.tsx @@ -24,7 +24,7 @@ import { checkKeys, getNewVar } from '@/utils/var' import Switch from '@/app/components/base/switch' import Toast from '@/app/components/base/toast' import { Settings01 } from '@/app/components/base/icons/src/vender/line/general' -import ConfirmModal from '@/app/components/base/confirm/common' +import Confirm from '@/app/components/base/confirm' import ConfigContext from '@/context/debug-configuration' import { AppType } from '@/types/app' import type { ExternalDataTool } from '@/models/common' @@ -389,11 +389,10 @@ const ConfigVar: FC = ({ promptVariables, readonly, onPromptVar )} {isShowDeleteContextVarModal && ( - { didRemoveVar(removeIndex as number) hideDeleteContextVarModal() diff --git a/web/app/components/app/configuration/config/automatic/get-automatic-res.tsx b/web/app/components/app/configuration/config/automatic/get-automatic-res.tsx index 1939dd3ad7..55d5661036 100644 --- a/web/app/components/app/configuration/config/automatic/get-automatic-res.tsx +++ b/web/app/components/app/configuration/config/automatic/get-automatic-res.tsx @@ -282,7 +282,6 @@ const GetAutomaticRes: FC = ({ title={t('appDebug.generate.overwriteTitle')} content={t('appDebug.generate.overwriteMessage')} isShow={showConfirmOverwrite} - onClose={() => setShowConfirmOverwrite(false)} onConfirm={() => { setShowConfirmOverwrite(false) onFinished(res!) diff --git a/web/app/components/app/configuration/index.tsx b/web/app/components/app/configuration/index.tsx index 82d25bb3ac..432accb0d2 100644 --- a/web/app/components/app/configuration/index.tsx +++ b/web/app/components/app/configuration/index.tsx @@ -880,7 +880,6 @@ const Configuration: FC = () => { title={t('appDebug.resetConfig.title')} content={t('appDebug.resetConfig.message')} isShow={restoreConfirmOpen} - onClose={() => setRestoreConfirmOpen(false)} onConfirm={resetAppConfig} onCancel={() => setRestoreConfirmOpen(false)} /> @@ -890,7 +889,6 @@ const Configuration: FC = () => { title={t('appDebug.trailUseGPT4Info.title')} content={t('appDebug.trailUseGPT4Info.description')} isShow={showUseGPT4Confirm} - onClose={() => setShowUseGPT4Confirm(false)} onConfirm={() => { setShowAccountSettingModal({ payload: 'provider' }) setShowUseGPT4Confirm(false) diff --git a/web/app/components/app/overview/appCard.tsx b/web/app/components/app/overview/appCard.tsx index ae44664f9f..ccf1f8ef1a 100644 --- a/web/app/components/app/overview/appCard.tsx +++ b/web/app/components/app/overview/appCard.tsx @@ -185,7 +185,6 @@ function AppCard({ title={t('appOverview.overview.appInfo.regenerate')} content={t('appOverview.overview.appInfo.regenerateNotice')} isShow={showConfirmDelete} - onClose={() => setShowConfirmDelete(false)} onConfirm={() => { onGenCode() setShowConfirmDelete(false) diff --git a/web/app/components/app/switch-app-modal/index.tsx b/web/app/components/app/switch-app-modal/index.tsx index e5ac6ed55e..79f4811e43 100644 --- a/web/app/components/app/switch-app-modal/index.tsx +++ b/web/app/components/app/switch-app-modal/index.tsx @@ -147,10 +147,6 @@ const SwitchAppModal = ({ show, appDetail, inAppDetail = false, onSuccess, onClo setShowConfirmDelete(false) setRemoveOriginal(false) }} - onClose={() => { - setShowConfirmDelete(false) - setRemoveOriginal(false) - }} /> )} diff --git a/web/app/components/base/chat/chat-with-history/sidebar/index.tsx b/web/app/components/base/chat/chat-with-history/sidebar/index.tsx index f589878711..dd145c36b9 100644 --- a/web/app/components/base/chat/chat-with-history/sidebar/index.tsx +++ b/web/app/components/base/chat/chat-with-history/sidebar/index.tsx @@ -121,7 +121,6 @@ const Sidebar = () => { title={t('share.chat.deleteConversation.title')} content={t('share.chat.deleteConversation.content') || ''} isShow - onClose={handleCancelConfirm} onCancel={handleCancelConfirm} onConfirm={handleDelete} /> diff --git a/web/app/components/base/confirm-ui/index.tsx b/web/app/components/base/confirm-ui/index.tsx deleted file mode 100644 index 0976566628..0000000000 --- a/web/app/components/base/confirm-ui/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -'use client' -import type { FC } from 'react' -import React from 'react' -import { useTranslation } from 'react-i18next' -import Button from '../button' - -export type IConfirmUIProps = { - type: 'info' | 'warning' - title: string - content: string - confirmText?: string - onConfirm: () => void - cancelText?: string - onCancel: () => void -} - -const ConfirmUI: FC = ({ - type, - title, - content, - confirmText, - cancelText, - onConfirm, - onCancel, -}) => { - const { t } = useTranslation() - return ( -
-
- {type === 'info' && ( - - )} - {type === 'warning' && ( - - - )} -
{title}
-
- -
-
{content}
-
- -
- - -
-
- - ) -} -export default React.memo(ConfirmUI) diff --git a/web/app/components/base/confirm/common.module.css b/web/app/components/base/confirm/common.module.css deleted file mode 100644 index 98c8cd5bb9..0000000000 --- a/web/app/components/base/confirm/common.module.css +++ /dev/null @@ -1,7 +0,0 @@ -.wrapper-danger { - background: linear-gradient(180deg, rgba(217, 45, 32, 0.05) 0%, rgba(217, 45, 32, 0.00) 24.02%), #F9FAFB; -} - -.wrapper-success { - background: linear-gradient(180deg, rgba(3, 152, 85, 0.05) 0%, rgba(3, 152, 85, 0.00) 22.44%), #F9FAFB; -} \ No newline at end of file diff --git a/web/app/components/base/confirm/common.tsx b/web/app/components/base/confirm/common.tsx deleted file mode 100644 index 1c7fd303ae..0000000000 --- a/web/app/components/base/confirm/common.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import type { FC, ReactElement } from 'react' -import { useTranslation } from 'react-i18next' -import { - RiCloseLine, - RiErrorWarningFill, -} from '@remixicon/react' -import s from './common.module.css' -import cn from '@/utils/classnames' -import Modal from '@/app/components/base/modal' -import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general' -import Button from '@/app/components/base/button' - -export type ConfirmCommonProps = { - type?: string - isShow: boolean - onCancel: () => void - title: string - desc?: string - onConfirm?: () => void - showOperate?: boolean - showOperateCancel?: boolean - confirmBtnClassName?: string - confirmText?: string - confirmWrapperClassName?: string - confirmDisabled?: boolean -} - -const ConfirmCommon: FC = ({ - type = 'danger', - isShow, - onCancel, - title, - desc, - onConfirm, - showOperate = true, - showOperateCancel = true, - confirmBtnClassName, - confirmText, - confirmWrapperClassName, - confirmDisabled, -}) => { - const { t } = useTranslation() - - const CONFIRM_MAP: Record = { - danger: { - icon: , - confirmText: t('common.operation.remove'), - }, - success: { - icon: , - confirmText: t('common.operation.ok'), - }, - } - - return ( - { }} className='!w-[480px] !max-w-[480px] !p-0 !rounded-2xl' wrapperClassName={confirmWrapperClassName}> -
-
- -
-
- {CONFIRM_MAP[type].icon} -
-
{title}
- { - desc &&
{desc}
- } - { - showOperate && ( -
- { - showOperateCancel && ( - - ) - } - -
- ) - } -
-
- ) -} - -export default ConfirmCommon diff --git a/web/app/components/base/confirm/index.tsx b/web/app/components/base/confirm/index.tsx index 2a00e9bc2c..137687b4bd 100644 --- a/web/app/components/base/confirm/index.tsx +++ b/web/app/components/base/confirm/index.tsx @@ -1,26 +1,27 @@ -import { Dialog, Transition } from '@headlessui/react' -import { Fragment } from 'react' +import React, { useEffect, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' -import ConfirmUI from '../confirm-ui' +import Button from '../button' -// https://headlessui.com/react/dialog - -type IConfirm = { +export type IConfirm = { className?: string isShow: boolean - onClose: () => void type?: 'info' | 'warning' title: string - content: string - confirmText?: string + content?: React.ReactNode + confirmText?: string | null onConfirm: () => void cancelText?: string onCancel: () => void + isLoading?: boolean + isDisabled?: boolean + showConfirm?: boolean + showCancel?: boolean + maskClosable?: boolean } -export default function Confirm({ +function Confirm({ isShow, - onClose, type = 'warning', title, content, @@ -28,52 +29,76 @@ export default function Confirm({ cancelText, onConfirm, onCancel, + showConfirm = true, + showCancel = true, + isLoading = false, + isDisabled = false, + maskClosable = true, }: IConfirm) { const { t } = useTranslation() + const dialogRef = useRef(null) + const [isVisible, setIsVisible] = useState(isShow) + const confirmTxt = confirmText || `${t('common.operation.confirm')}` const cancelTxt = cancelText || `${t('common.operation.cancel')}` - return ( - - e.preventDefault()}> - -
- -
-
- - - - - + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') + onCancel() + } + document.addEventListener('keydown', handleKeyDown) + return () => { + document.removeEventListener('keydown', handleKeyDown) + } + }, [onCancel]) + + const handleClickOutside = (event: MouseEvent) => { + if (maskClosable && dialogRef.current && !dialogRef.current.contains(event.target as Node)) + onCancel() + } + + useEffect(() => { + document.addEventListener('mousedown', handleClickOutside) + return () => { + document.removeEventListener('mousedown', handleClickOutside) + } + }, [maskClosable]) + + useEffect(() => { + if (isShow) { + setIsVisible(true) + } + else { + const timer = setTimeout(() => setIsVisible(false), 200) + return () => clearTimeout(timer) + } + }, [isShow]) + + if (!isVisible) + return null + + return createPortal( +
{ + e.preventDefault() + e.stopPropagation() + }}> +
+
+
+
{title}
+
{content}
+
+
+ {showCancel && } + {showConfirm && }
-
-
+ + , document.body, ) } + +export default React.memo(Confirm) diff --git a/web/app/components/base/modal/delete-confirm-modal/index.tsx b/web/app/components/base/modal/delete-confirm-modal/index.tsx deleted file mode 100644 index 8c66dc6704..0000000000 --- a/web/app/components/base/modal/delete-confirm-modal/index.tsx +++ /dev/null @@ -1,66 +0,0 @@ -'use client' -import type { FC } from 'react' -import React from 'react' -import { useTranslation } from 'react-i18next' -import { - RiErrorWarningFill, -} from '@remixicon/react' -import s from './style.module.css' -import Modal from '@/app/components/base/modal' -import Button from '@/app/components/base/button' - -type Props = { - isShow: boolean - onHide: () => void - onRemove: () => void - text?: string - children?: JSX.Element -} - -const DeleteConfirmModal: FC = ({ - isShow, - onHide, - onRemove, - children, - text, -}) => { - const { t } = useTranslation() - if (!isShow) - return null - - return ( - -
{ - e.stopPropagation() - e.stopPropagation() - e.nativeEvent.stopImmediatePropagation() - }}> -
- -
- {text - ? ( -
{text}
- ) - : children} - -
- - -
-
-
- ) -} -export default React.memo(DeleteConfirmModal) diff --git a/web/app/components/base/modal/delete-confirm-modal/style.module.css b/web/app/components/base/modal/delete-confirm-modal/style.module.css deleted file mode 100644 index 3e4953f47f..0000000000 --- a/web/app/components/base/modal/delete-confirm-modal/style.module.css +++ /dev/null @@ -1,16 +0,0 @@ -.delModal { - background: linear-gradient(180deg, - rgba(217, 45, 32, 0.05) 0%, - rgba(217, 45, 32, 0) 24.02%), - #f9fafb; - box-shadow: 0px 20px 24px -4px rgba(16, 24, 40, 0.08), - 0px 8px 8px -4px rgba(16, 24, 40, 0.03); - @apply rounded-2xl p-8; -} - -.warningWrapper { - box-shadow: 0px 20px 24px -4px rgba(16, 24, 40, 0.08), - 0px 8px 8px -4px rgba(16, 24, 40, 0.03); - background: rgba(255, 255, 255, 0.9); - @apply h-12 w-12 border-[0.5px] border-gray-100 rounded-xl mb-3 flex items-center justify-center; -} \ No newline at end of file diff --git a/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx b/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx index fdc0cf1198..c65b244f6d 100644 --- a/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx +++ b/web/app/components/datasets/documents/detail/completed/SegmentCard.tsx @@ -4,15 +4,13 @@ import { ArrowUpRightIcon } from '@heroicons/react/24/outline' import { useTranslation } from 'react-i18next' import { RiDeleteBinLine, - RiErrorWarningFill, } from '@remixicon/react' import { StatusItem } from '../../list' import { DocumentTitle } from '../index' import s from './style.module.css' import { SegmentIndexTag } from './index' import cn from '@/utils/classnames' -import Modal from '@/app/components/base/modal' -import Button from '@/app/components/base/button' +import Confirm from '@/app/components/base/confirm' import Switch from '@/app/components/base/switch' import Divider from '@/app/components/base/divider' import Indicator from '@/app/components/header/indicator' @@ -217,26 +215,15 @@ const SegmentCard: FC = ({ )} - {showModal && setShowModal(false)} className={s.delModal} closable> -
-
- -
-
{t('datasetDocuments.segment.delete')}
-
- - -
-
-
} + {showModal + && { await onDelete?.(id) }} + onCancel={() => setShowModal(false)} + /> + } ) } diff --git a/web/app/components/datasets/documents/list.tsx b/web/app/components/datasets/documents/list.tsx index dbdbffeb95..cb44f5cc28 100644 --- a/web/app/components/datasets/documents/list.tsx +++ b/web/app/components/datasets/documents/list.tsx @@ -4,7 +4,6 @@ import type { FC, SVGProps } from 'react' import React, { useCallback, useEffect, useState } from 'react' import { useBoolean, useDebounceFn } from 'ahooks' import { ArrowDownIcon, TrashIcon } from '@heroicons/react/24/outline' -import { ExclamationCircleIcon } from '@heroicons/react/24/solid' import { pick } from 'lodash-es' import { RiMoreFill, @@ -23,8 +22,7 @@ import cn from '@/utils/classnames' import Switch from '@/app/components/base/switch' import Divider from '@/app/components/base/divider' import Popover from '@/app/components/base/popover' -import Modal from '@/app/components/base/modal' -import Button from '@/app/components/base/button' +import Confirm from '@/app/components/base/confirm' import Tooltip from '@/app/components/base/tooltip' import { ToastContext } from '@/app/components/base/toast' import type { IndicatorProps } from '@/app/components/header/indicator' @@ -294,25 +292,16 @@ export const OperationAction: FC<{ className={`flex justify-end !w-[200px] h-fit !z-20 ${className}`} /> )} - {showModal && setShowModal(false)} className={s.delModal} closable> -
-
- -
-
{t('datasetDocuments.list.delete.title')}
-
{t('datasetDocuments.list.delete.content')}
-
- - -
-
-
} + {showModal + && onOperate('delete')} + onCancel={() => setShowModal(false)} + /> + } {isShowRenameModal && currDocument && ( { - setDelKeyId('') - setShowConfirmDelete(false) - }} onConfirm={onDel} onCancel={() => { setDelKeyId('') diff --git a/web/app/components/explore/sidebar/index.tsx b/web/app/components/explore/sidebar/index.tsx index 2d12752c48..1a3e767baa 100644 --- a/web/app/components/explore/sidebar/index.tsx +++ b/web/app/components/explore/sidebar/index.tsx @@ -137,7 +137,6 @@ const SideBar: FC = ({ title={t('explore.sidebar.delete.title')} content={t('explore.sidebar.delete.content')} isShow={showConfirm} - onClose={() => setShowConfirm(false)} onConfirm={handleDelete} onCancel={() => setShowConfirm(false)} /> diff --git a/web/app/components/header/account-setting/account-page/index.tsx b/web/app/components/header/account-setting/account-page/index.tsx index a8a51b1c77..7520022c7b 100644 --- a/web/app/components/header/account-setting/account-page/index.tsx +++ b/web/app/components/header/account-setting/account-page/index.tsx @@ -1,16 +1,14 @@ 'use client' import { useState } from 'react' import { useTranslation } from 'react-i18next' -import { - RiCloseLine, - RiErrorWarningFill, -} from '@remixicon/react' + import { useContext } from 'use-context-selector' import Collapse from '../collapse' import type { IItem } from '../collapse' import s from './index.module.css' import classNames from '@/utils/classnames' import Modal from '@/app/components/base/modal' +import Confirm from '@/app/components/base/confirm' import Button from '@/app/components/base/button' import { updateUserProfile } from '@/service/common' import { useAppContext } from '@/context/app-context' @@ -245,30 +243,24 @@ export default function AccountPage() { )} {showDeleteAccountModal && ( - { }} - > -
setShowDeleteAccountModal(false)}> - -
-
- -
-
{t('common.account.delete')}
-
- {t('common.account.deleteTip')} -
-
- {t('common.account.deleteConfirmTip')} - support@dify.ai -
-
{`Delete Account: ${userProfile.email}`}
-
- -
-
+ setShowDeleteAccountModal(false)} + onConfirm={() => setShowDeleteAccountModal(false)} + showCancel={false} + type='warning' + title={t('common.account.delete')} + content={<> +
+ {t('common.account.deleteTip')} +
+
+ {t('common.account.deleteConfirmTip')} + support@dify.ai +
+ } + confirmText={t('common.operation.ok') as string} + /> )} ) diff --git a/web/app/components/header/account-setting/api-based-extension-page/item.tsx b/web/app/components/header/account-setting/api-based-extension-page/item.tsx index 7cdeca9717..6d716c638e 100644 --- a/web/app/components/header/account-setting/api-based-extension-page/item.tsx +++ b/web/app/components/header/account-setting/api-based-extension-page/item.tsx @@ -8,7 +8,7 @@ import { Edit02 } from '@/app/components/base/icons/src/vender/line/general' import type { ApiBasedExtension } from '@/models/common' import { useModalContext } from '@/context/modal-context' import { deleteApiBasedExtension } from '@/service/common' -import ConfirmCommon from '@/app/components/base/confirm/common' +import Confirm from '@/app/components/base/confirm' type ItemProps = { data: ApiBasedExtension @@ -57,18 +57,14 @@ const Item: FC = ({ { - showDeleteConfirm && ( - setShowDeleteConfirm(false)} title={`${t('common.operation.delete')} “${data.name}”?`} onConfirm={handleDeleteApiBasedExtension} - confirmWrapperClassName='!z-30' confirmText={t('common.operation.delete') || ''} - confirmBtnClassName='!bg-[#D92D20]' /> - ) } ) diff --git a/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx b/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx index f63de083d6..967bcccdca 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx @@ -48,7 +48,7 @@ import { PortalToFollowElemContent, } from '@/app/components/base/portal-to-follow-elem' import { useToastContext } from '@/app/components/base/toast' -import ConfirmCommon from '@/app/components/base/confirm/common' +import Confirm from '@/app/components/base/confirm' import { useAppContext } from '@/context/app-context' type ModelModalProps = { @@ -385,12 +385,11 @@ const ModelModal: FC = ({ { showConfirm && ( - setShowConfirm(false)} onConfirm={handleRemove} - confirmWrapperClassName='z-[70]' /> ) } diff --git a/web/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx b/web/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx index e94b7c5834..86857f1ab2 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx @@ -40,7 +40,7 @@ import { PortalToFollowElemContent, } from '@/app/components/base/portal-to-follow-elem' import { useToastContext } from '@/app/components/base/toast' -import ConfirmCommon from '@/app/components/base/confirm/common' +import Confirm from '@/app/components/base/confirm' type ModelModalProps = { provider: ModelProvider @@ -330,12 +330,11 @@ const ModelLoadBalancingEntryModal: FC = ({ { showConfirm && ( - setShowConfirm(false)} onConfirm={handleRemove} - confirmWrapperClassName='z-[70]' /> ) } diff --git a/web/app/components/tools/provider/detail.tsx b/web/app/components/tools/provider/detail.tsx index 546b9cd9a1..566fe4623a 100644 --- a/web/app/components/tools/provider/detail.tsx +++ b/web/app/components/tools/provider/detail.tsx @@ -366,7 +366,6 @@ const ProviderDetail = ({ title={t('tools.createTool.deleteToolConfirmTitle')} content={t('tools.createTool.deleteToolConfirmContent')} isShow={showConfirmDelete} - onClose={() => setShowConfirmDelete(false)} onConfirm={handleConfirmDelete} onCancel={() => setShowConfirmDelete(false)} /> diff --git a/web/app/components/workflow/header/restoring-title.tsx b/web/app/components/workflow/header/restoring-title.tsx index cdb9040230..344e5e2754 100644 --- a/web/app/components/workflow/header/restoring-title.tsx +++ b/web/app/components/workflow/header/restoring-title.tsx @@ -12,7 +12,7 @@ const RestoringTitle = () => { return (
- {t('workflow.common.latestPublished')} + {t('workflow.common.latestPublished')} {formatTimeFromNow(publishedAt)}
) diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index 345ed46ff0..34c7fc4dcc 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -87,7 +87,7 @@ import { FeaturesProvider } from '@/app/components/base/features' import type { Features as FeaturesData } from '@/app/components/base/features/types' import { useFeaturesStore } from '@/app/components/base/features/hooks' import { useEventEmitterContextContext } from '@/context/event-emitter' -import Confirm from '@/app/components/base/confirm/common' +import Confirm from '@/app/components/base/confirm' const nodeTypes = { [CUSTOM_NODE]: CustomNode, @@ -330,8 +330,7 @@ const Workflow: FC = memo(({ onCancel={() => setShowConfirm(undefined)} onConfirm={showConfirm.onConfirm} title={showConfirm.title} - desc={showConfirm.desc} - confirmWrapperClassName='!z-[11]' + content={showConfirm.desc} /> ) } diff --git a/web/app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx b/web/app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx index 2e18a5f4c7..bf3fd86865 100644 --- a/web/app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx +++ b/web/app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx @@ -25,7 +25,6 @@ const RemoveVarConfirm: FC = ({ content={t(`${i18nPrefix}.content`)} onConfirm={onConfirm} onCancel={onCancel} - onClose={onCancel} /> ) } diff --git a/web/hooks/use-pay.tsx b/web/hooks/use-pay.tsx index cd43e8dd99..344f03955c 100644 --- a/web/hooks/use-pay.tsx +++ b/web/hooks/use-pay.tsx @@ -10,10 +10,10 @@ import { fetchDataSourceNotionBinding, fetchFreeQuotaVerify, } from '@/service/common' -import type { ConfirmCommonProps } from '@/app/components/base/confirm/common' -import Confirm from '@/app/components/base/confirm/common' +import type { IConfirm } from '@/app/components/base/confirm' +import Confirm from '@/app/components/base/confirm' -export type ConfirmType = Pick +export type ConfirmType = Pick export const useAnthropicCheckPay = () => { const { t } = useTranslation() @@ -25,7 +25,7 @@ export const useAnthropicCheckPay = () => { useEffect(() => { if (providerName === 'anthropic' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) { setConfirm({ - type: paymentResult === 'succeeded' ? 'success' : 'danger', + type: paymentResult === 'succeeded' ? 'info' : 'warning', title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'), }) } @@ -44,7 +44,7 @@ export const useBillingPay = () => { useEffect(() => { if (paymentType === 'billing' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) { setConfirm({ - type: paymentResult === 'succeeded' ? 'success' : 'danger', + type: paymentResult === 'succeeded' ? 'info' : 'warning', title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'), }) } @@ -96,7 +96,7 @@ export const useCheckFreeQuota = () => { useEffect(() => { if (error) - router.replace('/', { forceOptimisticNavigation: false }) + router.replace('/') }, [error, router]) useEffect(() => { @@ -106,7 +106,7 @@ export const useCheckFreeQuota = () => { return (data && provider) ? { - type: data.flag ? 'success' : 'danger', + type: data.flag ? 'info' : 'warning', title: data.flag ? QUOTA_RECEIVE_STATUS[provider as string].success[locale] : QUOTA_RECEIVE_STATUS[provider].fail[locale], desc: !data.flag ? data.reason : undefined, } @@ -130,13 +130,13 @@ export const useCheckNotion = () => { useEffect(() => { if (data) - router.replace('/', { forceOptimisticNavigation: false }) + router.replace('/') }, [data, router]) useEffect(() => { if (type === 'notion') { if (notionError) { setConfirm({ - type: 'danger', + type: 'warning', title: notionError, }) } @@ -160,7 +160,7 @@ export const CheckModal = () => { const handleCancelShowPayStatusModal = useCallback(() => { setShowPayStatusModal(false) - router.replace('/', { forceOptimisticNavigation: false }) + router.replace('/') }, [router]) const confirmInfo = anthropicConfirmInfo || freeQuotaConfirmInfo || notionConfirmInfo || billingConfirmInfo @@ -173,11 +173,11 @@ export const CheckModal = () => { isShow onCancel={handleCancelShowPayStatusModal} onConfirm={handleCancelShowPayStatusModal} - type={confirmInfo.type} + showCancel={false} + type={confirmInfo.type === 'info' ? 'info' : 'warning' } title={confirmInfo.title} - desc={confirmInfo.desc} - showOperateCancel={false} - confirmText={(confirmInfo.type === 'danger' && t('common.operation.ok')) || ''} + content={(confirmInfo as { desc: string }).desc || ''} + confirmText={(confirmInfo.type === 'info' && t('common.operation.ok')) || ''} /> ) } diff --git a/web/i18n/en-US/common.ts b/web/i18n/en-US/common.ts index 5c7a3d1d0e..d48a9c233e 100644 --- a/web/i18n/en-US/common.ts +++ b/web/i18n/en-US/common.ts @@ -348,7 +348,7 @@ const translation = { getFreeTokens: 'Get free Tokens', priorityUsing: 'Prioritize using', deprecated: 'Deprecated', - confirmDelete: 'confirm deletion?', + confirmDelete: 'Confirm deletion?', quotaTip: 'Remaining available free tokens', loadPresets: 'Load Presents', parameters: 'PARAMETERS',