// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useCallback, useMemo } from 'react'; import type { Selection } from 'react-aria-components'; import { ListBox, ListBoxItem } from 'react-aria-components'; import type { EmojiParentKey } from './data/emojis'; import { EmojiSkinTone, getEmojiVariantByParentKeyAndSkinTone, } from './data/emojis'; import { strictAssert } from '../../util/assert'; import { FunStaticEmoji } from './FunEmoji'; import type { LocalizerType } from '../../types/I18N'; export type FunSkinTonesListProps = Readonly<{ i18n: LocalizerType; emoji: EmojiParentKey; skinTone: EmojiSkinTone | null; onSelectSkinTone: (skinTone: EmojiSkinTone) => void; }>; export function FunSkinTonesList(props: FunSkinTonesListProps): JSX.Element { const { i18n, onSelectSkinTone } = props; const handleSelectionChange = useCallback( (keys: Selection) => { strictAssert(keys !== 'all', 'Expected single selection'); strictAssert(keys.size === 1, 'Expected single selection'); const [first] = keys.values(); onSelectSkinTone(first as EmojiSkinTone); }, [onSelectSkinTone] ); return ( ); } type FunSkinTonesListItemProps = Readonly<{ emoji: EmojiParentKey; 'aria-label': string; skinTone: EmojiSkinTone; }>; function FunSkinTonesListItem(props: FunSkinTonesListItemProps) { const variant = useMemo(() => { return getEmojiVariantByParentKeyAndSkinTone(props.emoji, props.skinTone); }, [props.emoji, props.skinTone]); return (
); }