another idea

This commit is contained in:
asiaznik
2023-05-18 15:33:20 +02:00
parent ce4be12d92
commit cc068cc2b9
3 changed files with 150 additions and 17 deletions
+100 -2
View File
@@ -3,7 +3,7 @@ import styles from './toast.module.css';
import type { IconName } from '@blueprintjs/icons';
import { IconNames } from '@blueprintjs/icons';
import classNames from 'classnames';
import type { HTMLAttributes, HtmlHTMLAttributes } from 'react';
import { HTMLAttributes, HtmlHTMLAttributes, ReactNode, useState } from 'react';
import { forwardRef, useEffect } from 'react';
import { useCallback } from 'react';
import { useLayoutEffect } from 'react';
@@ -11,6 +11,7 @@ import { useRef } from 'react';
import { Intent } from '../../utils/intent';
import { Icon } from '../icon';
import { Loader } from '../loader';
import { t } from '@vegaprotocol/i18n';
export type ToastContent = JSX.Element | undefined;
@@ -63,6 +64,78 @@ export const Panel = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
}
);
type CollapsablePanelProps = {
actions?: ReactNode;
};
export const CollapsablePanel = forwardRef<
HTMLDivElement,
CollapsablePanelProps & HTMLAttributes<HTMLDivElement>
>(({ children, className, actions, ...props }, ref) => {
const [collapsed, setCollapsed] = useState(true);
return (
<div
data-panel
ref={ref}
data-test
className={classNames(
'relative',
'p-2 rounded mt-[10px]',
'font-mono text-[12px] leading-[16px] font-normal',
'[&>h4]:font-bold',
'overflow-auto',
{
'h-[64px] overflow-hidden': collapsed,
'pb-4': !collapsed,
},
className
)}
aria-expanded={!collapsed}
onDoubleClick={(e) => {
e.preventDefault();
setCollapsed(!collapsed);
}}
{...props}
>
{children}
{collapsed && (
<div
data-panel-curtain
className={classNames(
'bg-gradient-to-b from-transparent to-inherit',
'absolute bottom-0 left-0 h-8 w-full pointer-events-none'
)}
></div>
)}
<div
data-panel-actions
className={classNames(
'absolute bottom-0 right-0',
'p-2',
'rounded-tl',
'flex align-middle gap-1'
)}
>
{actions}
<button
className="cursor-pointer"
onClick={(e) => {
e.preventDefault();
setCollapsed(!collapsed);
}}
title={collapsed ? t('Expand') : t('Collapse')}
aria-label={collapsed ? t('Expand') : t('Collapse')}
>
{collapsed ? (
<Icon name="expand-all" size={3} />
) : (
<Icon name="collapse-all" size={3} />
)}
</button>
</div>
</div>
);
});
export const ToastHeading = forwardRef<
HTMLHeadingElement,
HtmlHTMLAttributes<HTMLHeadingElement>
@@ -171,7 +244,7 @@ export const Toast = ({
},
// panel's colours
{
'[&_[data-panel]]:bg-vega-light-150 [&_[data-panel]]:dark:bg-vega-dark-150 ':
'[&_[data-panel]]:bg-vega-light-150 [&_[data-panel]]:dark:bg-vega-dark-150':
intent === Intent.None,
'[&_[data-panel]]:bg-vega-blue-350 [&_[data-panel]]:dark:bg-vega-blue-650':
intent === Intent.Primary,
@@ -182,6 +255,31 @@ export const Toast = ({
'[&_[data-panel]]:bg-vega-pink-350 [&_[data-panel]]:dark:bg-vega-pink-650':
intent === Intent.Danger,
},
{
'[&_[data-panel]]:to-vega-light-150 [&_[data-panel]]:dark:to-vega-dark-150':
intent === Intent.None,
'[&_[data-panel]]:to-vega-blue-350 [&_[data-panel]]:dark:to-vega-blue-650':
intent === Intent.Primary,
'[&_[data-panel]]:to-vega-green-350 [&_[data-panel]]:dark:to-vega-green-650':
intent === Intent.Success,
'[&_[data-panel]]:to-vega-orange-350 [&_[data-panel]]:dark:to-vega-orange-650':
intent === Intent.Warning,
'[&_[data-panel]]:to-vega-pink-350 [&_[data-panel]]:dark:to-vega-pink-650':
intent === Intent.Danger,
},
// panel's actions
{
'[&_[data-panel-actions]]:bg-vega-light-200 [&_[data-panel-actions]]:dark:bg-vega-dark-100 ':
intent === Intent.None,
'[&_[data-panel-actions]]:bg-vega-blue-400 [&_[data-panel-actions]]:dark:bg-vega-blue-600':
intent === Intent.Primary,
'[&_[data-panel-actions]]:bg-vega-green-400 [&_[data-panel-actions]]:dark:bg-vega-green-600':
intent === Intent.Success,
'[&_[data-panel-actions]]:bg-vega-orange-400 [&_[data-panel-actions]]:dark:bg-vega-orange-600':
intent === Intent.Warning,
'[&_[data-panel-actions]]:bg-vega-pink-400 [&_[data-panel-actions]]:dark:bg-vega-pink-600':
intent === Intent.Danger,
},
// panels's progress bar colours
'[&_[data-progress-bar]]:mt-[10px] [&_[data-progress-bar]]:mb-[4px]',
{
@@ -1,6 +1,6 @@
import { formatNumber, toBigNum } from '@vegaprotocol/utils';
import { t } from '@vegaprotocol/i18n';
import type { Toast } from '@vegaprotocol/ui-toolkit';
import { CollapsablePanel, Toast } from '@vegaprotocol/ui-toolkit';
import { CopyWithTooltip, Icon } from '@vegaprotocol/ui-toolkit';
import { ToastHeading } from '@vegaprotocol/ui-toolkit';
import { Panel } from '@vegaprotocol/ui-toolkit';
@@ -51,23 +51,57 @@ const EthWithdrawalApprovalToastContent = ({
</strong>
</Panel>
);
const bundle = [
['asset_source', tx.approval?.assetSource],
['amount', tx.approval?.amount],
['target_address', tx.approval?.targetAddress],
['creation', tx.approval?.creation],
['nonce', tx.approval?.nonce],
['signatures', tx.approval?.signatures],
];
const bundleCopy = bundle.map((item) => item.join('\n')).join('\n\n');
console.log(bundleCopy);
const panel = (
<Panel
className="flex align-middle max-w-full"
title={tx.approval?.signatures}
>
<div className="truncate text-ellipsis">{tx.approval?.signatures}</div>
<CopyWithTooltip text={tx.approval?.signatures}>
<button data-testid="copy-withdrawal-signatures" className="underline">
{t('Copy bundle')} <Icon name="duplicate" className="ml-2" />
</button>
</CopyWithTooltip>
</Panel>
);
const signatureBundleInfo = tx.approval?.signatures ? (
<div className="mt-3">
<p>{t('Please copy your signature...')}</p>
<Panel
className="flex align-middle max-w-full"
title={tx.approval.signatures}
<p>{t('Transaction details:')}</p>
<CollapsablePanel
actions={
<CopyWithTooltip text={bundleCopy}>
<button
data-testid="copy-withdrawal-signatures"
className="underline"
title={t('Copy transaction details bundle')}
>
<Icon name="duplicate" size={3} />
</button>
</CopyWithTooltip>
}
>
<div className="truncate text-ellipsis">{tx.approval.signatures}</div>
<CopyWithTooltip text={tx.approval?.signatures}>
<button
data-testid="copy-withdrawal-signatures"
className="underline"
>
<Icon name="duplicate" className="ml-2" />
</button>
</CopyWithTooltip>
</Panel>
{bundle.map(([key, value]) => (
<div className="mb-1">
<div className="font-bold">{key}</div>
<div className="break-all">{value}</div>
</div>
))}
</CollapsablePanel>
</div>
) : (
''
@@ -130,6 +130,7 @@ export const WithdrawalsTable = (
component: data?.txHash ? 'EtherscanLinkCell' : 'CompleteCell',
})}
/>
<AgGridColumn field="id" />
</AgGrid>
);
};