// 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 { FunEmoji } from '../FunEmoji'; export type SkinTonesListBoxProps = Readonly<{ emoji: EmojiParentKey; skinTone: EmojiSkinTone; onSelectSkinTone: (skinTone: EmojiSkinTone) => void; }>; export function SkinTonesListBox(props: SkinTonesListBoxProps): JSX.Element { const { 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 SkinTonesListBoxItemProps = Readonly<{ emoji: EmojiParentKey; skinTone: EmojiSkinTone; }>; function SkinTonesListBoxItem(props: SkinTonesListBoxItemProps) { const variant = useMemo(() => { return getEmojiVariantByParentKeyAndSkinTone(props.emoji, props.skinTone); }, [props.emoji, props.skinTone]); return ( ); }