// Copyright 2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import { useState, useCallback, type JSX, useMemo } from 'react'; import lodash from 'lodash'; import type { LocalizerType } from '../types/Util.std.ts'; import { ReactionPickerPicker, ReactionPickerPickerEmojiButton, ReactionPickerPickerStyle, } from './ReactionPickerPicker.dom.tsx'; import { FunEmojiPicker } from './fun/FunEmojiPicker.dom.tsx'; import type { FunEmojiSelection } from './fun/panels/FunPanelEmojis.dom.tsx'; import { Emoji } from '../axo/emoji.std.ts'; import { AxoDialog } from '../axo/AxoDialog.dom.tsx'; import { tw } from '../axo/tw.dom.tsx'; const { isEqual } = lodash; export type PropsType = { draftPreferredReactions: ReadonlyArray; hadSaveError: boolean; i18n: LocalizerType; isSaving: boolean; originalPreferredReactions: ReadonlyArray; recentEmojis: ReadonlyArray; selectedDraftEmojiIndex: undefined | number; emojiSkinToneDefault: Emoji.SkinTone | null; cancelCustomizePreferredReactionsModal: () => unknown; deselectDraftEmoji: () => unknown; onEmojiSkinToneDefaultChange: (emojiSkinToneDefault: Emoji.SkinTone) => void; replaceSelectedDraftEmoji: (newEmoji: Emoji.Variant) => unknown; resetDraftEmoji: () => unknown; savePreferredReactions: () => unknown; selectDraftEmojiToBeReplaced: (index: number) => unknown; }; export function CustomizingPreferredReactionsModal({ cancelCustomizePreferredReactionsModal, deselectDraftEmoji, draftPreferredReactions, emojiSkinToneDefault, hadSaveError, i18n, isSaving, originalPreferredReactions, replaceSelectedDraftEmoji, resetDraftEmoji, savePreferredReactions, selectDraftEmojiToBeReplaced, selectedDraftEmojiIndex, }: Readonly): JSX.Element { const isSomethingSelected = selectedDraftEmojiIndex !== undefined; const hasChanged = useMemo(() => { return !isEqual(originalPreferredReactions, draftPreferredReactions); }, [originalPreferredReactions, draftPreferredReactions]); const isDefaults = useMemo(() => { return isEqual( Emoji.getDefaultPreferredReactionEmojis( emojiSkinToneDefault ?? Emoji.SkinTone.None ), draftPreferredReactions ); }, [emojiSkinToneDefault, draftPreferredReactions]); return ( {i18n('icu:CustomizingPreferredReactions__title')}
{draftPreferredReactions.map((emoji, index) => { return ( { selectDraftEmojiToBeReplaced(index); }} onDeselect={deselectDraftEmoji} onSelectEmoji={emojiSelection => { replaceSelectedDraftEmoji(emojiSelection.emoji); }} /> ); })}

{hadSaveError ? i18n('icu:CustomizingPreferredReactions__had-save-error') : i18n('icu:CustomizingPreferredReactions__subtitle')}

{i18n('icu:reset')} {i18n('icu:save')}
); } function CustomizingPreferredReactionsModalItem(props: { emoji: Emoji.Variant; isSelected: boolean; onSelect: () => void; onDeselect: () => void; onSelectEmoji: (emojiSelection: FunEmojiSelection) => void; }) { const { onDeselect } = props; const [emojiPickerOpen, setEmojiPickerOpen] = useState(false); const handleEmojiPickerOpenChange = useCallback( (open: boolean) => { setEmojiPickerOpen(open); if (!open) { onDeselect(); } }, [onDeselect] ); return ( ); }