95 lines
3.2 KiB
React
95 lines
3.2 KiB
React
|
// @flow
|
||
|
import 'scss/component/_sticker-selector.scss';
|
||
|
import { FREE_GLOBAL_STICKERS, PAID_GLOBAL_STICKERS } from 'constants/stickers';
|
||
|
import * as ICONS from 'constants/icons';
|
||
|
import Button from 'component/button';
|
||
|
import CreditAmount from 'component/common/credit-amount';
|
||
|
import OptimizedImage from 'component/optimizedImage';
|
||
|
import React from 'react';
|
||
|
|
||
|
const buildStickerSideLink = (section: string, icon: string) => ({ section, icon });
|
||
|
|
||
|
const STICKER_SIDE_LINKS = [
|
||
|
buildStickerSideLink(__('Free'), ICONS.TAG),
|
||
|
buildStickerSideLink(__('Tips'), ICONS.FINANCE),
|
||
|
// Future work may include Channel, Subscriptions, ...
|
||
|
];
|
||
|
|
||
|
type Props = { claimIsMine: boolean, onSelect: (any) => void };
|
||
|
|
||
|
export default function StickerSelector(props: Props) {
|
||
|
const { claimIsMine, onSelect } = props;
|
||
|
|
||
|
function scrollToStickerSection(section: string) {
|
||
|
const listBodyEl = document.querySelector('.stickerSelector__listBody');
|
||
|
const sectionToScroll = document.getElementById(section);
|
||
|
|
||
|
if (listBodyEl && sectionToScroll) {
|
||
|
// $FlowFixMe
|
||
|
listBodyEl.scrollTo({
|
||
|
top: sectionToScroll.offsetTop - sectionToScroll.getBoundingClientRect().height * 2,
|
||
|
behavior: 'smooth',
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const getListRow = (rowTitle: string, rowStickers: any) => (
|
||
|
<div className="stickerSelector__listBody-row">
|
||
|
<div id={rowTitle} className="stickerSelector__listBody-rowTitle">
|
||
|
{rowTitle}
|
||
|
</div>
|
||
|
<div className="stickerSelector__listBody-rowItems">
|
||
|
{rowStickers.map((sticker) => (
|
||
|
<Button
|
||
|
key={sticker.name}
|
||
|
title={sticker.name}
|
||
|
button="alt"
|
||
|
className="button--file-action"
|
||
|
onClick={() => onSelect(sticker)}
|
||
|
>
|
||
|
<OptimizedImage src={sticker.url} waitLoad />
|
||
|
{sticker.price && sticker.price > 0 && (
|
||
|
<CreditAmount superChatLight amount={sticker.price} size={2} isFiat />
|
||
|
)}
|
||
|
</Button>
|
||
|
))}
|
||
|
</div>
|
||
|
</div>
|
||
|
);
|
||
|
|
||
|
return (
|
||
|
<div className="stickerSelector">
|
||
|
<div className="stickerSelector__header card__header--between">
|
||
|
<div className="stickerSelector__headerTitle card__title-section--small">{__('Stickers')}</div>
|
||
|
</div>
|
||
|
|
||
|
<div className="stickerSelector__list">
|
||
|
<div className="stickerSelector__listBody">
|
||
|
{getListRow(__('Free'), FREE_GLOBAL_STICKERS)}
|
||
|
{!claimIsMine && getListRow(__('Tips'), PAID_GLOBAL_STICKERS)}
|
||
|
</div>
|
||
|
|
||
|
<div className="navigation__wrapper">
|
||
|
<ul className="navigation-links">
|
||
|
{STICKER_SIDE_LINKS.map(
|
||
|
(linkProps) =>
|
||
|
((claimIsMine && linkProps.section !== 'Tips') || !claimIsMine) && (
|
||
|
<li key={linkProps.section}>
|
||
|
<Button
|
||
|
label={__(linkProps.section)}
|
||
|
title={__(linkProps.section)}
|
||
|
icon={linkProps.icon}
|
||
|
iconSize={1}
|
||
|
className="navigation-link"
|
||
|
onClick={() => scrollToStickerSection(linkProps.section)}
|
||
|
/>
|
||
|
</li>
|
||
|
)
|
||
|
)}
|
||
|
</ul>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
);
|
||
|
}
|