From f8fc82670e14d60d22685918efa2901d6dfcd09b Mon Sep 17 00:00:00 2001 From: Jonathan Newman Date: Tue, 4 Jan 2022 14:49:57 -0600 Subject: [PATCH] migrated logic into index --- dts.config.js | 4 +++ src/index.tsx | 65 +++++++++++++++++++++++++++++++++++++++++++++-- src/usePrompt.tsx | 63 --------------------------------------------- 3 files changed, 67 insertions(+), 65 deletions(-) delete mode 100644 src/usePrompt.tsx diff --git a/dts.config.js b/dts.config.js index ba3c055..ec948cf 100644 --- a/dts.config.js +++ b/dts.config.js @@ -17,6 +17,10 @@ module.exports = { extract: !!options.writeMeta, }) ); + + console.info('options.format', options.format); + // options.format = ''; + return config; }, }; diff --git a/src/index.tsx b/src/index.tsx index 3c0db45..1cc296d 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,2 +1,63 @@ -export { usePrompt as default } from './usePrompt'; -export * from './usePrompt'; +import { ReactNode, useEffect, useState } from 'react'; + +export type PromptResponse = any; +export type RendererCallback = (prompt: { + visible: boolean; + resolve: (value: PromptResponse) => void; + reject: (value?: PromptResponse) => void; +}) => ReactNode; + +interface Prompt { + state: 'pending' | 'hidden'; + renderer: RendererCallback; + resolve: (value: PromptResponse) => void; + reject: (value?: PromptResponse) => void; +} + +/** + * Use prompt hook + * @returns [prompt, showPrompt, visible] + */ +export default function usePrompt(): [ + ReactNode, + (renderer: RendererCallback) => Promise, + boolean +] { + const [visible, setVisible] = useState(false); + const [prompt, setPrompt] = useState({ + state: 'hidden', + renderer: () => null, + resolve: () => {}, + reject: () => {}, + }); + + function resolve(value?: PromptResponse) { + prompt.resolve(value); + setPrompt({ ...prompt, state: 'hidden' }); + } + function reject(value?: PromptResponse) { + prompt.reject(value); + setPrompt({ ...prompt, state: 'hidden' }); + } + + useEffect(() => { + const setVisibleTimeout = setTimeout(() => { + setVisible(prompt.state === 'pending'); + }); + return () => clearTimeout(setVisibleTimeout); + }, [prompt]); + + return [ + prompt.renderer({ visible, resolve, reject }), + (renderer) => + new Promise((resolve, reject) => + setPrompt({ + state: 'pending', + renderer, + resolve, + reject, + }) + ), + visible, + ]; +} diff --git a/src/usePrompt.tsx b/src/usePrompt.tsx deleted file mode 100644 index 5daafdd..0000000 --- a/src/usePrompt.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { ReactNode, useEffect, useState } from 'react'; - -export type PromptResponse = any; -export type RendererCallback = (prompt: { - visible: boolean; - resolve: (value: PromptResponse) => void; - reject: (value?: PromptResponse) => void; -}) => ReactNode; - -interface Prompt { - state: 'pending' | 'hidden'; - renderer: RendererCallback; - resolve: (value: PromptResponse) => void; - reject: (value?: PromptResponse) => void; -} - -/** - * Use prompt hook - * @returns [prompt, showPrompt, visible] - */ -export function usePrompt(): [ - ReactNode, - (renderer: RendererCallback) => Promise, - boolean -] { - const [visible, setVisible] = useState(false); - const [prompt, setPrompt] = useState({ - state: 'hidden', - renderer: () => null, - resolve: () => {}, - reject: () => {}, - }); - - function resolve(value?: PromptResponse) { - prompt.resolve(value); - setPrompt({ ...prompt, state: 'hidden' }); - } - function reject(value?: PromptResponse) { - prompt.reject(value); - setPrompt({ ...prompt, state: 'hidden' }); - } - - useEffect(() => { - const setVisibleTimeout = setTimeout(() => { - setVisible(prompt.state === 'pending'); - }); - return () => clearTimeout(setVisibleTimeout); - }, [prompt]); - - return [ - prompt.renderer({ visible, resolve, reject }), - (renderer) => - new Promise((resolve, reject) => - setPrompt({ - state: 'pending', - renderer, - resolve, - reject, - }) - ), - visible, - ]; -}