You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
1 year ago
|
import { ReactNode } from "react";
|
||
|
import { Button } from "../Button";
|
||
|
import clsx from "clsx";
|
||
|
import Spinner from "../Spinner";
|
||
|
|
||
|
interface TTDDialogPanelProps {
|
||
|
label: string;
|
||
|
children: ReactNode;
|
||
|
panelAction?: {
|
||
|
label: string;
|
||
|
action: () => void;
|
||
|
icon?: ReactNode;
|
||
|
};
|
||
|
panelActionDisabled?: boolean;
|
||
|
onTextSubmitInProgess?: boolean;
|
||
|
renderTopRight?: () => ReactNode;
|
||
1 year ago
|
renderSubmitShortcut?: () => ReactNode;
|
||
1 year ago
|
renderBottomRight?: () => ReactNode;
|
||
|
}
|
||
|
|
||
|
export const TTDDialogPanel = ({
|
||
|
label,
|
||
|
children,
|
||
|
panelAction,
|
||
|
panelActionDisabled = false,
|
||
|
onTextSubmitInProgess,
|
||
|
renderTopRight,
|
||
1 year ago
|
renderSubmitShortcut,
|
||
1 year ago
|
renderBottomRight,
|
||
|
}: TTDDialogPanelProps) => {
|
||
|
return (
|
||
|
<div className="ttd-dialog-panel">
|
||
|
<div className="ttd-dialog-panel__header">
|
||
|
<label>{label}</label>
|
||
|
{renderTopRight?.()}
|
||
|
</div>
|
||
|
|
||
|
{children}
|
||
|
<div
|
||
|
className={clsx("ttd-dialog-panel-button-container", {
|
||
|
invisible: !panelAction,
|
||
|
})}
|
||
|
style={{ display: "flex", alignItems: "center" }}
|
||
|
>
|
||
|
<Button
|
||
|
className="ttd-dialog-panel-button"
|
||
|
onSelect={panelAction ? panelAction.action : () => {}}
|
||
|
disabled={panelActionDisabled || onTextSubmitInProgess}
|
||
|
>
|
||
|
<div className={clsx({ invisible: onTextSubmitInProgess })}>
|
||
|
{panelAction?.label}
|
||
|
{panelAction?.icon && <span>{panelAction.icon}</span>}
|
||
|
</div>
|
||
|
{onTextSubmitInProgess && <Spinner />}
|
||
|
</Button>
|
||
1 year ago
|
{!panelActionDisabled &&
|
||
|
!onTextSubmitInProgess &&
|
||
|
renderSubmitShortcut?.()}
|
||
1 year ago
|
{renderBottomRight?.()}
|
||
|
</div>
|
||
|
</div>
|
||
|
);
|
||
|
};
|