// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import { useVirtualizer } from '@tanstack/react-virtual'; import lodash from 'lodash'; import React, { useCallback, useEffect, useRef } from 'react'; import { type ComponentMeta } from '../../storybook/types.js'; import type { FunStaticEmojiProps } from './FunEmoji.js'; import { FunInlineEmoji, FunStaticEmoji } from './FunEmoji.js'; import { _getAllEmojiVariantKeys, emojiVariantConstant, getEmojiParentByKey, getEmojiParentKeyByVariantKey, getEmojiVariantByKey, } from './data/emojis.js'; const { chunk } = lodash; export default { title: 'Components/Fun/FunEmoji', component: All, args: { size: 16, }, argTypes: { size: { control: { type: 'select' }, options: [16, 32] }, }, } satisfies ComponentMeta; const COLUMNS = 8; type AllProps = Pick; export function All(props: AllProps): JSX.Element { const scrollerRef = useRef(null); const data = Array.from(_getAllEmojiVariantKeys()); const rows = chunk(data, COLUMNS); const getScrollElement = useCallback(() => { return scrollerRef.current; }, []); const estimateSize = useCallback(() => { return props.size; }, [props.size]); const rowVirtualizer = useVirtualizer({ count: rows.length, getScrollElement, estimateSize, gap: 4, }); const lastMeasuredSizeRef = useRef(props.size); useEffect(() => { if (lastMeasuredSizeRef.current !== props.size) { rowVirtualizer.measure(); lastMeasuredSizeRef.current = props.size; } }, [rowVirtualizer, props.size]); return (
{rowVirtualizer.getVirtualItems().map(rowItem => { const row = rows[rowItem.index]; return (
{row.map(emojiVariantKey => { const variant = getEmojiVariantByKey(emojiVariantKey); const parentKey = getEmojiParentKeyByVariantKey(emojiVariantKey); const parent = getEmojiParentByKey(parentKey); return (
); })}
); })}
); } export function Inline(): JSX.Element { return (

{' '} Lorem, ipsum dolor sit amet consectetur adipisicing elit. Repellat voluptates, mollitia tempora alias libero repudiandae nesciunt. Deleniti ducimus dolorum, debitis, reprehenderit at ut deserunt fuga corrupti provident quae natus a!{' '} {' '} Consectetur quibusdam accusantium magni ipsum nemo eligendi quisquam dolor, recusandae vero dolore reiciendis doloribus ducimus officiis minima! Unde accusantium ut eaque error quidem soluta! Distinctio dicta rem nemo aut quo.{' '}

); }