|
import React from 'react' |
|
import * as AlertDialog from '@radix-ui/react-alert-dialog' |
|
import NiceModal, { useModal } from '@ebay/nice-modal-react' |
|
import { debounce } from 'lodash-es' |
|
|
|
import classes from './styles.module.css' |
|
|
|
const { |
|
AlertDialogOverlay, |
|
AlertDialogContent, |
|
AlertDialogTitle, |
|
'lds-roller': LdsRoller, |
|
} = classes |
|
|
|
function CSSLoading() { |
|
return ( |
|
<div className={LdsRoller}> |
|
<div></div> |
|
<div></div> |
|
<div></div> |
|
<div></div> |
|
<div></div> |
|
<div></div> |
|
<div></div> |
|
<div></div> |
|
</div> |
|
) |
|
} |
|
|
|
const Loading = NiceModal.create<{ title: string }>( |
|
({ title }: { title: string }) => { |
|
const modal = useLoading() |
|
return ( |
|
<AlertDialog.Root defaultOpen={true} open={modal.visible}> |
|
<AlertDialog.Portal> |
|
<AlertDialog.Overlay className={AlertDialogOverlay} /> |
|
<AlertDialog.Content className={AlertDialogContent}> |
|
<AlertDialog.Title className={AlertDialogTitle}> |
|
<CSSLoading></CSSLoading> |
|
{title} |
|
</AlertDialog.Title> |
|
</AlertDialog.Content> |
|
</AlertDialog.Portal> |
|
</AlertDialog.Root> |
|
) |
|
} |
|
) |
|
|
|
export function useLoading() { |
|
return useModal(Loading) |
|
} |
|
|
|
declare type NiceModalArgs<T> = T extends |
|
| keyof JSX.IntrinsicElements |
|
| React.JSXElementConstructor<any> |
|
? Omit<React.ComponentProps<T>, 'id'> |
|
: Record<string, unknown> |
|
|
|
export type ShowProps = NiceModalArgs<typeof Loading> |
|
|
|
export function GetLoading(wait = 0) { |
|
const show = debounce((props: ShowProps) => { |
|
NiceModal.show(Loading, props) |
|
}, wait) |
|
|
|
return { |
|
show: (props: ShowProps) => { |
|
show(props) |
|
}, |
|
hide: () => { |
|
show.cancel() |
|
HideLoading() |
|
}, |
|
} |
|
} |
|
|
|
export function ShowLoading(props: ShowProps) { |
|
NiceModal.show(Loading, props) |
|
} |
|
|
|
export function HideLoading() { |
|
NiceModal.hide(Loading) |
|
} |
|
|