1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00

made scalable related card titles

This commit is contained in:
Fedor Katurov 2020-11-28 15:27:32 +07:00
parent 370cf132eb
commit 25dade6c67
2 changed files with 54 additions and 10 deletions

View file

@ -1,15 +1,17 @@
import React, { FC, memo, useCallback, useState, useMemo } from 'react'; import React, { FC, memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
import styles from './styles.module.scss'; import styles from "./styles.module.scss";
import classNames from 'classnames'; import classNames from "classnames";
import { INode } from '~/redux/types'; import { INode } from "~/redux/types";
import { URLS, PRESETS } from '~/constants/urls'; import { PRESETS, URLS } from "~/constants/urls";
import { RouteComponentProps, withRouter } from 'react-router'; import { RouteComponentProps, withRouter } from "react-router";
import { getURL, stringToColour } from '~/utils/dom'; import { getURL, stringToColour } from "~/utils/dom";
type IProps = RouteComponentProps & { type IProps = RouteComponentProps & {
item: Partial<INode>; item: Partial<INode>;
}; };
type CellSize = 'small' | 'medium' | 'large'
const getTitleLetters = (title: string): string => { const getTitleLetters = (title: string): string => {
const words = (title && title.split(' ')) || []; const words = (title && title.split(' ')) || [];
@ -26,6 +28,8 @@ const getTitleLetters = (title: string): string => {
const NodeRelatedItemUnconnected: FC<IProps> = memo(({ item, history }) => { const NodeRelatedItemUnconnected: FC<IProps> = memo(({ item, history }) => {
const [is_loaded, setIsLoaded] = useState(false); const [is_loaded, setIsLoaded] = useState(false);
const [width, setWidth] = useState(0);
const ref = useRef<HTMLDivElement>(null);
const onClick = useCallback(() => history.push(URLS.NODE_URL(item.id)), [item, history]); const onClick = useCallback(() => history.push(URLS.NODE_URL(item.id)), [item, history]);
const thumb = useMemo( const thumb = useMemo(
@ -37,11 +41,26 @@ const NodeRelatedItemUnconnected: FC<IProps> = memo(({ item, history }) => {
[] []
); );
useEffect(() => {
if (!ref.current) return;
const cb = () => setWidth(ref.current.getBoundingClientRect().width)
window.addEventListener('resize', cb);
cb();
return () => window.removeEventListener('resize', cb);
}, [ref.current])
const size = useMemo<CellSize>(() => {
if (width > 90) return 'large';
if (width > 76) return 'medium';
return 'small';
}, [width])
return ( return (
<div <div
className={classNames(styles.item, { [styles.is_loaded]: is_loaded })} className={classNames(styles.item, styles[size], { [styles.is_loaded]: is_loaded })}
key={item.id} key={item.id}
onClick={onClick} onClick={onClick}
ref={ref}
> >
<div <div
className={styles.thumb} className={styles.thumb}
@ -50,12 +69,18 @@ const NodeRelatedItemUnconnected: FC<IProps> = memo(({ item, history }) => {
}} }}
/> />
{!item.thumbnail && ( {!item.thumbnail && size === 'small' && (
<div className={styles.letters} style={{ backgroundColor }}> <div className={styles.letters} style={{ backgroundColor }}>
{getTitleLetters(item.title)} {getTitleLetters(item.title)}
</div> </div>
)} )}
{!item.thumbnail && size !== 'small' && (
<div className={styles.title} style={{ backgroundColor }}>
{item.title}
</div>
)}
<img <img
src={getURL({ url: item.thumbnail }, PRESETS.avatar)} src={getURL({ url: item.thumbnail }, PRESETS.avatar)}
alt="loader" alt="loader"

View file

@ -32,7 +32,7 @@
} }
} }
.letters { .letters, .title {
position: absolute; position: absolute;
display: flex; display: flex;
align-items: center; align-items: center;
@ -50,3 +50,22 @@
transparentize($content_bg, 0.4) transparentize($content_bg, 0.4)
); );
} }
.title {
text-transform: uppercase;
padding: $gap / 2;
box-sizing: border-box;
align-items: flex-start;
justify-content: flex-start;
word-break: break-word;
overflow: hidden;
color: transparentize(white, 0.3);
.large & {
font: $font_14_semibold;
}
.medium & {
font: $font_12_bold;
}
}