nitro-react/src/common/layout/LayoutGridItem.tsx

73 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-12-13 06:43:53 +01:00
import { FC, useMemo } from 'react';
import { ItemCountView } from '../../views/shared/item-count/ItemCountView';
2022-01-06 04:04:53 +01:00
import { LimitedEditionStyledNumberView } from '../../views/shared/limited-edition/LimitedEditionStyledNumberView';
2022-01-03 06:10:55 +01:00
import { Base } from '../Base';
2021-12-13 06:43:53 +01:00
import { Column, ColumnProps } from '../Column';
export interface LayoutGridItemProps extends ColumnProps
{
itemImage?: string;
itemColor?: string;
itemActive?: boolean;
itemCount?: number;
itemCountMinimum?: number;
2022-01-06 03:59:46 +01:00
itemUniqueSoldout?: boolean;
2021-12-13 06:43:53 +01:00
itemUniqueNumber?: number;
itemUnseen?: boolean;
2022-01-12 05:01:59 +01:00
disabled?: boolean;
2021-12-13 06:43:53 +01:00
}
export const LayoutGridItem: FC<LayoutGridItemProps> = props =>
{
2022-01-12 05:01:59 +01:00
const { itemImage = undefined, itemColor = undefined, itemActive = false, itemCount = 1, itemCountMinimum = 1, itemUniqueSoldout = false, itemUniqueNumber = -2, itemUnseen = false, disabled = false, center = true, column = true, style = {}, classNames = [], position = 'relative', overflow = 'hidden', children = null, ...rest } = props;
2021-12-13 06:43:53 +01:00
const getClassNames = useMemo(() =>
{
const newClassNames: string[] = [ 'layout-grid-item', 'border', 'border-2', 'border-muted', 'rounded' ];
if(itemActive) newClassNames.push('active');
2022-01-06 03:59:46 +01:00
if(itemUniqueSoldout || (itemUniqueNumber > 0)) newClassNames.push('unique-item');
2021-12-13 06:43:53 +01:00
2022-01-06 03:59:46 +01:00
if(itemUniqueSoldout) newClassNames.push('sold-out');
2021-12-13 06:43:53 +01:00
if(itemUnseen) newClassNames.push('unseen');
2022-01-12 05:01:59 +01:00
if(disabled) newClassNames.push('disabled')
2021-12-13 06:43:53 +01:00
if(itemImage === null) newClassNames.push('icon', 'loading-icon');
if(classNames.length) newClassNames.push(...classNames);
return newClassNames;
2022-01-12 05:01:59 +01:00
}, [ itemActive, itemUniqueSoldout, itemUniqueNumber, itemUnseen, disabled, itemImage, classNames ]);
2021-12-13 06:43:53 +01:00
const getStyle = useMemo(() =>
{
2022-01-06 03:59:46 +01:00
let newStyle = { ...style };
2021-12-13 06:43:53 +01:00
if(itemImage) newStyle.backgroundImage = `url(${ itemImage })`;
if(itemColor) newStyle.backgroundColor = itemColor;
2022-01-06 03:59:46 +01:00
if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
2021-12-13 06:43:53 +01:00
return newStyle;
}, [ style, itemImage, itemColor ]);
return (
2022-01-06 03:59:46 +01:00
<Column center={ center } pointer position={ position } overflow={ overflow } column={ column } classNames={ getClassNames } style={ getStyle } { ...rest }>
2021-12-13 06:43:53 +01:00
{ (itemCount > itemCountMinimum) &&
<ItemCountView count={ itemCount } /> }
2022-01-03 06:10:55 +01:00
{ (itemUniqueNumber > 0) &&
<>
<Base fit className="unique-bg-override" style={ { backgroundImage: `url(${ itemImage })` } } />
<div className="position-absolute bottom-0 unique-item-counter">
<LimitedEditionStyledNumberView value={ itemUniqueNumber } />
</div>
</> }
2021-12-13 06:43:53 +01:00
{ children }
</Column>
);
}