/* eslint-disable @typescript-eslint/no-unsafe-return,
@typescript-eslint/no-explicit-any,
@typescript-eslint/no-unsafe-call,
@typescript-eslint/no-unsafe-member-access,
@typescript-eslint/no-unsafe-assignment,
@typescript-eslint/no-confusing-void-expression */
import type { ReactNode } from 'react';
import { useState, useCallback } from 'react';
import { createPortal } from 'react-dom';
import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
import { Helmet } from 'react-helmet';
import type {
DragStartEvent,
DragEndEvent,
UniqueIdentifier,
// Announcements,
// ScreenReaderInstructions,
} from '@dnd-kit/core';
import {
DndContext,
closestCenter,
KeyboardSensor,
PointerSensor,
useSensor,
useSensors,
DragOverlay,
} from '@dnd-kit/core';
import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
import {
SortableContext,
sortableKeyboardCoordinates,
rectSortingStrategy,
useSortable,
} from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import MenuIcon from '@/material-icons/400-24px/menu.svg?react';
import EmojiReactionIcon from '@/material-icons/400-24px/mood.svg?react';
import { updateReactionDeck } from 'mastodon/actions/reaction_deck';
import { Button } from 'mastodon/components/button';
import { Column } from 'mastodon/components/column';
import { ColumnHeader } from 'mastodon/components/column_header';
import { Icon } from 'mastodon/components/icon';
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
import EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';
import { autoPlayGif } from 'mastodon/initial_state';
import { useAppDispatch, useAppSelector } from 'mastodon/store';
import emojify from '../emoji/emoji';
const messages = defineMessages({
reaction_deck_add: { id: 'reaction_deck.add', defaultMessage: 'Add' },
heading: { id: 'column.reaction_deck', defaultMessage: 'Reaction deck' },
});
const ReactionEmoji: React.FC<{
index: number;
emoji: string;
emojiMap: any;
overlay?: boolean;
onChange?: (index: number, emoji: any) => void;
onRemove?: (index: number) => void;
}> = ({ index, emoji, emojiMap, overlay, onChange, onRemove }) => {
const handleChange = useCallback(
(emoji: any) => {
if (onChange) onChange(index, emoji);
},
[index, onChange],
);
const handleRemove = useCallback(() => {
if (onRemove) onRemove(index);
}, [index, onRemove]);
const { attributes, listeners, setNodeRef, transform, transition } =
useSortable({ id: index.toString() });
const style = {
transform: CSS.Transform.toString(transform),
transition,
};
let content: ReactNode;
const mapEmoji = emojiMap.find((e: any) => e.get('shortcode') === emoji);
if (mapEmoji) {
const filename = autoPlayGif
? mapEmoji.get('url')
: mapEmoji.get('static_url');
const shortCode = `:${emoji}:`;
content = (
);
} else {
const html = { __html: emojify(emoji) };
content = ;
}
if (overlay) {
return