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

76 lines
2.9 KiB
TypeScript
Raw Normal View History

2021-12-13 06:43:53 +01:00
import { FC, useMemo } from 'react';
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';
2022-03-03 18:09:41 +01:00
import { LayoutItemCountView } from './LayoutItemCountView';
2022-03-12 06:52:59 +01:00
import { LayoutLimitedEditionStyledNumberView } from './limited-edition';
2021-12-13 06:43:53 +01:00
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-02-22 06:24:45 +01:00
itemHighlight?: 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-02-22 06:24:45 +01:00
const { itemImage = undefined, itemColor = undefined, itemActive = false, itemCount = 1, itemCountMinimum = 1, itemUniqueSoldout = false, itemUniqueNumber = -2, itemUnseen = false, itemHighlight = 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-02-22 06:24:45 +01:00
if(itemHighlight) newClassNames.push('has-highlight');
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-02-22 06:24:45 +01:00
}, [ itemActive, itemUniqueSoldout, itemUniqueNumber, itemUnseen, itemHighlight, 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) &&
2022-03-03 18:09:41 +01:00
<LayoutItemCountView 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">
2022-03-12 06:52:59 +01:00
<LayoutLimitedEditionStyledNumberView value={ itemUniqueNumber } />
2022-01-03 06:10:55 +01:00
</div>
</> }
2021-12-13 06:43:53 +01:00
{ children }
</Column>
);
}