import { createContext, useContext, useMemo } from 'react'; import type { PropsWithChildren } from 'react'; import { Confirm, ConfirmProps } from '@affine/component'; import { createStore, useStore } from 'zustand'; import { combine, subscribeWithSelector } from 'zustand/middleware'; import { UseBoundStore } from 'zustand/react'; type ConfirmActions = { confirm: (props: ConfirmProps) => Promise; }; type ConfirmState = { record: Record; }; const create = () => createStore( subscribeWithSelector( combine( { record: {}, }, (set, get) => ({ confirm: ({ onCancel, onConfirm, ...props }: ConfirmProps) => { return new Promise(resolve => { const confirmRecord = { ...get().record }; const confirmId = String(Date.now()); const closeHandler = () => { delete confirmRecord[confirmId]; set({ record: { ...confirmRecord } }); }; set(({ record }) => { return { record: { ...record, [confirmId]: ( { closeHandler(); onCancel?.(); resolve(false); }} onConfirm={() => { closeHandler(); onConfirm?.(); resolve(true); }} /> ), }, }; }); }); }, }) ) ) ); type Store = ReturnType; export const ConfirmContext = createContext(null); export const useConfirmApi = () => { const api = useContext(ConfirmContext); if (!api) { throw new Error('cannot find confirm context'); } return api; }; export const useConfirm: UseBoundStore = (( selector: Parameters>[0], equals: Parameters>[1] ) => { const api = useConfirmApi(); return useStore(api, selector, equals); // eslint-disable-next-line @typescript-eslint/no-explicit-any }) as any; function Records() { const conform = useConfirm(store => store.record); return ( <> {Object.entries(conform).map(([confirmId, confirmNode]) => { return
{confirmNode}
; })} ); } export const ConfirmProvider = ({ children }: PropsWithChildren) => { return ( create(), [])}> {children} ); }; export default ConfirmProvider;