fix: cleanup usePromptModal (#7157)

This commit is contained in:
pengx17 2024-06-06 06:29:46 +00:00
parent 5bd9c7a2a3
commit 7095ca1be6
No known key found for this signature in database
GPG Key ID: 23F23D9E8B3971ED
4 changed files with 34 additions and 90 deletions

View File

@ -5,7 +5,6 @@ import {
ConfirmModal, ConfirmModal,
type ConfirmModalProps, type ConfirmModalProps,
useConfirmModal, useConfirmModal,
usePromptModal,
} from './confirm-modal'; } from './confirm-modal';
export default { export default {
@ -58,20 +57,3 @@ export const AutoClose = () => {
return <Button onClick={onConfirm}>Show confirm</Button>; return <Button onClick={onConfirm}>Show confirm</Button>;
}; };
export const Prompt = () => {
const openPrompt = usePromptModal();
const showPrompt = async () => {
const value = await openPrompt({
placeholder: 'Enter your name',
title: 'Give me a string',
message: 'What is your name?',
});
if (value) {
alert('your name is ' + value);
}
};
return <Button onClick={showPrompt}>Show prompt</Button>;
};

View File

@ -1,12 +1,10 @@
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { DialogTrigger } from '@radix-ui/react-dialog'; import { DialogTrigger } from '@radix-ui/react-dialog';
import clsx from 'clsx'; import clsx from 'clsx';
import type { PropsWithChildren, ReactNode } from 'react'; import type { PropsWithChildren } from 'react';
import { createContext, useCallback, useContext, useState } from 'react'; import { createContext, useCallback, useContext, useState } from 'react';
import type { ButtonProps } from '../button'; import type { ButtonProps } from '../button';
import { Button } from '../button'; import { Button } from '../button';
import Input from '../input';
import type { ModalProps } from './modal'; import type { ModalProps } from './modal';
import { Modal } from './modal'; import { Modal } from './modal';
import * as styles from './styles.css'; import * as styles from './styles.css';
@ -162,53 +160,3 @@ export const useConfirmModal = () => {
closeConfirmModal: context.closeConfirmModal, closeConfirmModal: context.closeConfirmModal,
}; };
}; };
export const usePromptModal = () => {
const { closeConfirmModal, openConfirmModal } = useConfirmModal();
const t = useAFFiNEI18N();
return useCallback(
(props: {
confirmText?: string;
cancelText?: string;
placeholder?: string;
message: ReactNode;
title: ReactNode;
abort?: AbortSignal;
}) => {
return new Promise<string | null>(resolve => {
let value = '';
const message = (
<div className={styles.promptModalContent}>
{props.message}
<Input
placeholder={props.placeholder}
onChange={e => (value = e)}
/>
</div>
);
openConfirmModal({
...props,
confirmButtonOptions: {
children: props.confirmText ?? t['Confirm'](),
type: 'primary',
},
cancelButtonOptions: {
children: props.cancelText ?? t['Cancel'](),
},
description: message,
onConfirm: () => {
resolve(value);
},
onCancel: () => {
resolve(null);
},
});
props.abort?.addEventListener('abort', () => {
resolve(null);
closeConfirmModal();
});
});
},
[closeConfirmModal, openConfirmModal, t]
);
};

View File

@ -2,7 +2,6 @@ import {
createReactComponentFromLit, createReactComponentFromLit,
useConfirmModal, useConfirmModal,
useLitPortalFactory, useLitPortalFactory,
usePromptModal,
} from '@affine/component'; } from '@affine/component';
import { useJournalInfoHelper } from '@affine/core/hooks/use-journal'; import { useJournalInfoHelper } from '@affine/core/hooks/use-journal';
import { QuickSearchService } from '@affine/core/modules/cmdk'; import { QuickSearchService } from '@affine/core/modules/cmdk';
@ -84,12 +83,11 @@ const usePatchSpecs = (page: Doc, specs: BlockSpec[]) => {
}, [page.collection]); }, [page.collection]);
const confirmModal = useConfirmModal(); const confirmModal = useConfirmModal();
const openPromptModal = usePromptModal();
const patchedSpecs = useMemo(() => { const patchedSpecs = useMemo(() => {
let patched = patchReferenceRenderer(specs, reactToLit, referenceRenderer); let patched = patchReferenceRenderer(specs, reactToLit, referenceRenderer);
patched = patchNotificationService( patched = patchNotificationService(
patchReferenceRenderer(patched, reactToLit, referenceRenderer), patchReferenceRenderer(patched, reactToLit, referenceRenderer),
{ ...confirmModal, prompt: openPromptModal } confirmModal
); );
if (!page.readonly && runtimeConfig.enablePeekView) { if (!page.readonly && runtimeConfig.enablePeekView) {
patched = patchPeekViewService(patched, peekViewService); patched = patchPeekViewService(patched, peekViewService);
@ -100,7 +98,6 @@ const usePatchSpecs = (page: Doc, specs: BlockSpec[]) => {
return patched; return patched;
}, [ }, [
confirmModal, confirmModal,
openPromptModal,
page.readonly, page.readonly,
peekViewService, peekViewService,
quickSearchService, quickSearchService,

View File

@ -1,11 +1,11 @@
import { import {
createReactComponentFromLit, createReactComponentFromLit,
type ElementOrFactory, type ElementOrFactory,
Input,
notify, notify,
toast, toast,
type ToastOptions, type ToastOptions,
type useConfirmModal, type useConfirmModal,
type usePromptModal,
} from '@affine/component'; } from '@affine/component';
import type { import type {
QuickSearchService, QuickSearchService,
@ -119,13 +119,7 @@ export function patchReferenceRenderer(
export function patchNotificationService( export function patchNotificationService(
specs: BlockSpec[], specs: BlockSpec[],
{ { closeConfirmModal, openConfirmModal }: ReturnType<typeof useConfirmModal>
closeConfirmModal,
openConfirmModal,
prompt,
}: ReturnType<typeof useConfirmModal> & {
prompt: ReturnType<typeof usePromptModal>;
}
) { ) {
const rootSpec = specs.find( const rootSpec = specs.find(
spec => spec.schema.model.flavour === 'affine:page' spec => spec.schema.model.flavour === 'affine:page'
@ -168,13 +162,36 @@ export function patchNotificationService(
cancelText, cancelText,
abort, abort,
}) => { }) => {
return prompt({ return new Promise<string | null>(resolve => {
message: toReactNode(message), let value = '';
const description = (
<div>
<span style={{ marginBottom: 12 }}>{toReactNode(message)}</span>
<Input placeholder={placeholder} onChange={e => (value = e)} />
</div>
);
openConfirmModal({
title: toReactNode(title), title: toReactNode(title),
confirmText, description: description,
cancelText, confirmButtonOptions: {
placeholder, children: confirmText ?? 'Confirm',
abort, type: 'primary',
},
cancelButtonOptions: {
children: cancelText ?? 'Cancel',
},
onConfirm: () => {
resolve(value);
},
onCancel: () => {
resolve(null);
},
});
abort?.addEventListener('abort', () => {
resolve(null);
closeConfirmModal();
});
}); });
}, },
toast: (message: string, options: ToastOptions) => { toast: (message: string, options: ToastOptions) => {