mirror of
https://github.com/toeverything/AFFiNE.git
synced 2024-11-27 03:52:41 +03:00
fix: cleanup usePromptModal (#7157)
This commit is contained in:
parent
5bd9c7a2a3
commit
7095ca1be6
@ -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>;
|
|
||||||
};
|
|
||||||
|
@ -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]
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
@ -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,
|
||||||
|
@ -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 = '';
|
||||||
title: toReactNode(title),
|
const description = (
|
||||||
confirmText,
|
<div>
|
||||||
cancelText,
|
<span style={{ marginBottom: 12 }}>{toReactNode(message)}</span>
|
||||||
placeholder,
|
<Input placeholder={placeholder} onChange={e => (value = e)} />
|
||||||
abort,
|
</div>
|
||||||
|
);
|
||||||
|
openConfirmModal({
|
||||||
|
title: toReactNode(title),
|
||||||
|
description: description,
|
||||||
|
confirmButtonOptions: {
|
||||||
|
children: confirmText ?? 'Confirm',
|
||||||
|
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) => {
|
Loading…
Reference in New Issue
Block a user