Skip to content

EX-1404 - fix: tooltip position on small screen size #399

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Apr 16, 2021
4 changes: 3 additions & 1 deletion source/features/transactions/components/TransactionInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ interface IAddressesRowProps {
const AddressesRow = ({
addresses,
highlightedAddress,
isMobile
isMobile,
}: IAddressesRowProps) => (
<>
{addresses?.filter(isDefined).map((io, index) => (
Expand Down Expand Up @@ -196,6 +196,7 @@ const TransactionInfo = (props: ITransactionInfoProps) => {
<div className={styles.value}>
<TokenList
tokens={props.mint!}
tooltipPositioning="translateCenter"
/>
</div>
</div>
Expand All @@ -211,6 +212,7 @@ const TransactionInfo = (props: ITransactionInfoProps) => {
<div className={styles.value}>
<TokenList
tokens={props.burn!}
tooltipPositioning="translateCenter"
/>
</div>
</div>
Expand Down
75 changes: 53 additions & 22 deletions source/features/transactions/components/TransactionTokenList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ import { TOKEN_LENGTH_TO_SCROLL } from '../constants';
import { IAsset, IToken } from '../types';
import styles from './TransactionTokenList.module.scss';

const TokenList = (props: { tokens: IToken[]; }) => {
const TokenList = (props: {
tokens: IToken[];
tooltipPositioning?: string;
}) => {
const [tooltipPosition, setTooltipPosition] = useState({});
const containerRef = useRef<HTMLDivElement>(null);
const [asset, setAsset] = useState<IAsset>({
assetName: '',
description: '',
fingerprint: '',
policyId: ''
policyId: '',
});
const [isVisible, setIsVisible] = useState(false);

Expand All @@ -21,6 +24,7 @@ const TokenList = (props: { tokens: IToken[]; }) => {
item: IAsset
) => {
const { offsetLeft } = event.currentTarget;

setTooltipPosition((prevState) => ({
...prevState,
left: offsetLeft + 120 * 0.75,
Expand All @@ -38,12 +42,23 @@ const TokenList = (props: { tokens: IToken[]; }) => {
label={asset.fingerprint}
body={
<ul>
<li><strong>Ticker</strong>: {asset.ticker}</li>
<li><strong>Name</strong>: {asset.name}</li>
<li><strong>Description</strong>: {asset.description}</li>
<li><strong>Policy ID</strong>: {asset.policyId}</li>
<li><strong>Asset Name</strong>: {asset.assetName}</li>
</ul>}
<li>
<strong>Ticker</strong>: {asset.ticker}
</li>
<li>
<strong>Name</strong>: {asset.name}
</li>
<li>
<strong>Description</strong>: {asset.description}
</li>
<li>
<strong>Policy ID</strong>: {asset.policyId}
</li>
<li>
<strong>Asset Name</strong>: {asset.assetName}
</li>
</ul>
}
/>
</div>
)}
Expand All @@ -58,35 +73,51 @@ const TokenList = (props: { tokens: IToken[]; }) => {
}}
className={styles.token}
>
{`${t.quantity} ${t.asset.ticker || addEllipsis(t.asset.fingerprint, 9, 4)}`}{' '}
{`${t.quantity} ${
t.asset.ticker || addEllipsis(t.asset.fingerprint, 9, 4)
}`}{' '}
</span>
))}
</div>
) : (
<div ref={containerRef} className={styles.tokenList}>
{props.tokens.map((t) => (
<span className={styles.token}>
<span className={styles.token}>
<Tooltip
themeClass={props.tooltipPositioning || 'translateRightTop'}
content={
<ContentContainer
label={t.asset.fingerprint}
body={<>
<ul>
<li><strong>Ticker</strong>: {t.asset.ticker}</li>
<li><strong>Name</strong>: {t.asset.name}</li>
<li><strong>Description</strong>: {t.asset.description}</li>
<li><strong>Policy ID</strong>: {t.asset.policyId}</li>
<li><strong>Asset Name</strong>: {t.asset.assetName}</li>
</ul>
</>}
body={
<>
<ul>
<li>
<strong>Ticker</strong>:asda {t.asset.ticker}
</li>
<li>
<strong>Name</strong>: {t.asset.name}
</li>
<li>
<strong>Description</strong>: {t.asset.description}
</li>
<li>
<strong>Policy ID</strong>: {t.asset.policyId}
</li>
<li>
<strong>Asset Name</strong>: {t.asset.assetName}
</li>
</ul>
</>
}
/>
}
>
{`${t.quantity} ${t.asset.ticker || addEllipsis(t.asset.fingerprint, 9, 4)}`}
{`${t.quantity} ${
t.asset.ticker || addEllipsis(t.asset.fingerprint, 9, 4)
}`}
</Tooltip>
</span>
)
)}
))}
</div>
)}
</>
Expand Down
23 changes: 18 additions & 5 deletions source/widgets/tooltip/Tooltip.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@
cursor: pointer;
position: relative;
}
.tooltip .translateCenter {

.tooltip .translateCenter,
.tooltip .translateRightTop {
@include text(11px, 300, var(--solid-text-color), 1.3px);
visibility: hidden;
text-align: left;
padding: 5px 10px;
background: #121326;
Expand All @@ -25,12 +26,24 @@
z-index: 9999000;
opacity: 1 !important;
width: 300px;
top: -5px;
left: 100px;
transition-delay: 0.2s;
@media (min-width: 768px) {
visibility: hidden;
}
}

.tooltip .translateCenter {
top: -5px;
left: 0;
}

.tooltip .translateRightTop {
top: -5px;
right: -15px;
}

.tooltip:hover .translateCenter {
.tooltip:hover .translateCenter,
.tooltip:hover .translateRightTop {
visibility: visible;
}

Expand Down
39 changes: 27 additions & 12 deletions source/widgets/tooltip/Tooltip.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import styles from './Tooltip.module.scss';
import { useState } from 'react';

interface ITooltipProps {
children: React.ReactNode;
Expand All @@ -8,26 +9,40 @@ interface ITooltipProps {
style?: object;
}

export const ContentContainer = (props: { label: string; body?: React.ReactNode }) => (
export const ContentContainer = (props: {
label: string;
body?: React.ReactNode;
}) => (
<div className={styles.contentContainer}>
<div className={styles.label}>{props.label}</div>
{ props.body ?? <div className={styles.body}>{props.body}</div> }
{props.body ?? <div className={styles.body}>{props.body}</div>}
</div>
);

const Tooltip = ({
children,
theme,
themeClass,
theme = 'tooltip',
themeClass = 'translateCenter',
content,
style,
}: ITooltipProps) => (
<div className={styles[theme ?? 'tooltip']}>
<span style={style} className={styles[themeClass || 'translateCenter']}>
{content}
</span>
{children}
</div>
);
}: ITooltipProps) => {
const [isVisible, setIsVisible] = useState(false);
const isMobile = window.innerWidth <= 768;

return isMobile ? (
<div className={styles[theme]}>
{isVisible && <span className={styles[themeClass]}>{content}</span>}

<div onClick={() => setIsVisible(!isVisible)}>{children}</div>
</div>
) : (
<div className={styles[theme]}>
<span style={style} className={styles[themeClass]}>
{content}
</span>
{children}
</div>
);
};

export default Tooltip;