/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import React, { useMemo, useCallback } from "react"; import { EmojiRoot } from "../emoji-icon-picker/emoji/emoji"; import { emojiToString } from "../emoji-icon-picker/helper"; import { Popover } from "../popover"; import { cn } from "../utils/classname"; import { convertPlacementToSideAndAlign } from "../utils/placement"; import type { TPlacement, TSide, TAlign } from "../utils/placement"; export interface EmojiReactionPickerProps { isOpen: boolean; handleToggle: (value: boolean) => void; buttonClassName?: string; closeOnSelect?: boolean; disabled?: boolean; dropdownClassName?: string; label: React.ReactNode; onChange: (emoji: string) => void; placement?: TPlacement; searchDisabled?: boolean; searchPlaceholder?: string; side?: TSide; align?: TAlign; } export function EmojiReactionPicker(props: EmojiReactionPickerProps) { const { isOpen, handleToggle, buttonClassName, closeOnSelect = true, disabled = false, dropdownClassName, label, onChange, placement = "bottom-start", searchDisabled = false, searchPlaceholder = "Search", side = "bottom", align = "start", } = props; // side and align calculations const { finalSide, finalAlign } = useMemo(() => { if (placement) { const converted = convertPlacementToSideAndAlign(placement); return { finalSide: converted.side, finalAlign: converted.align }; } return { finalSide: side, finalAlign: align }; }, [placement, side, align]); const handleEmojiChange = useCallback( (value: string) => { const emoji = emojiToString(value); onChange(emoji); if (closeOnSelect) handleToggle(false); }, [onChange, closeOnSelect, handleToggle] ); return ( {label}
); }