From d9d5071942afd3d1e20da014272ecb7e9f8efab0 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Fri, 9 May 2025 22:49:32 +0300 Subject: [PATCH] added useModal hook --- src/hooks/useModal.tsx | 50 ++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 1 + 2 files changed, 51 insertions(+) create mode 100644 src/hooks/useModal.tsx diff --git a/src/hooks/useModal.tsx b/src/hooks/useModal.tsx new file mode 100644 index 0000000..bd4ec61 --- /dev/null +++ b/src/hooks/useModal.tsx @@ -0,0 +1,50 @@ +import { useRef, useState, useCallback, useMemo } from 'react'; + +interface State { + isShow: boolean; +} + +export const useModal = () => { + const [state, setState] = useState({ isShow: false }); + const [data, setData] = useState(null); + const promiseConfig = useRef(null); + + const show = useCallback((data: any) => { + setData(data); + return new Promise((resolve, reject) => { + promiseConfig.current = { resolve, reject }; + setState({ isShow: true }); + }); + }, []); + + const hide = useCallback(() => { + setState({ isShow: false }); + setData(null); + }, []); + + const onOk = useCallback( + (payload: any) => { + const { resolve } = promiseConfig.current || {}; + hide(); + resolve?.(payload); + }, + [hide] + ); + + const onCancel = useCallback(() => { + const { reject } = promiseConfig.current || {}; + hide(); + reject?.(); + }, [hide]); + + return useMemo( + () => ({ + show, + onOk, + onCancel, + isShow: state.isShow, + data, + }), + [show, onOk, onCancel, state.isShow, data] + ); +}; diff --git a/src/index.ts b/src/index.ts index 8cf6e7b..138fd5d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ export { useResourceStatus } from './hooks/useResourceStatus'; export { Spacer } from './common/Spacer'; +export { useModal } from './hooks/useModal'; import './index.css' export { createQortalLink } from './utils/qortal'; export { IndexCategory } from './state/indexes';