Skip to content

Instantly share code, notes, and snippets.

@sp0033212000
Created June 26, 2021 03:17
Show Gist options
  • Save sp0033212000/5911ef6556714a07af726c77fcfc740f to your computer and use it in GitHub Desktop.
Save sp0033212000/5911ef6556714a07af726c77fcfc740f to your computer and use it in GitHub Desktop.
async prompt with custom component
import { useState, useCallback } from "react";
type Resolver = ((value: string) => void) | null;
type Rejecter = ((reason?: any) => void) | null;
const useAsyncDialog = () => {
const [show, setShow] = useState<boolean>(false);
const [resolver, setResolver] = useState<Resolver>(null);
const [rejecter, setRejecter] = useState<Rejecter>(null);
const dialog = useCallback(
() =>
new Promise((res) => {
setShow(true);
setResolver(
() =>
function (value: string) {
setResolver(null);
setShow(false);
res(value);
}
);
setRejecter(
() =>
function () {
setRejecter(null);
setShow(false);
res("");
}
);
}),
[show]
);
const handleConfirm = useCallback(
(value: string) => {
resolver?.(value);
},
[resolver]
);
const handleClose = useCallback(() => rejecter?.(), [rejecter]);
return { dialog, handleConfirm, handleClose, showAsyncPrompt: show };
};
export default useAsyncDialog;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment