import { useFloating, shift } from '@floating-ui/react'; import React, { useState } from 'react'; import { createPortal } from 'react-dom'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import { closeModal } from 'soapbox/actions/modals'; import { useBookmarkFolder, useUpdateBookmarkFolder } from 'soapbox/api/hooks'; import { Emoji, HStack, Icon, Input, Modal } from 'soapbox/components/ui'; import EmojiPickerDropdown from 'soapbox/features/emoji/components/emoji-picker-dropdown'; import { messages as emojiMessages } from 'soapbox/features/emoji/containers/emoji-picker-dropdown-container'; import { useAppDispatch, useClickOutside } from 'soapbox/hooks'; import { useTextField } from 'soapbox/hooks/forms'; import toast from 'soapbox/toast'; import type { Emoji as EmojiType } from 'soapbox/features/emoji'; const messages = defineMessages({ label: { id: 'bookmark_folders.new.title_placeholder', defaultMessage: 'New folder title' }, editSuccess: { id: 'bookmark_folders.edit.success', defaultMessage: 'Bookmark folder edited successfully' }, editFail: { id: 'bookmark_folders.edit.fail', defaultMessage: 'Failed to edit bookmark folder' }, }); interface IEmojiPicker { emoji?: string; emojiUrl?: string; onPickEmoji?: (emoji: EmojiType) => void; } const EmojiPicker: React.FC = ({ emoji, emojiUrl, ...props }) => { const intl = useIntl(); const title = intl.formatMessage(emojiMessages.emoji); const [visible, setVisible] = useState(false); const { x, y, strategy, refs, update } = useFloating({ middleware: [shift()], }); useClickOutside(refs, () => { setVisible(false); }); const handleToggle: React.KeyboardEventHandler & React.MouseEventHandler = (e) => { e.stopPropagation(); setVisible(!visible); }; return (
{createPortal(
, document.body, )}
); }; interface IEditBookmarkFolderModal { folderId: string; onClose: (type: string) => void; } const EditBookmarkFolderModal: React.FC = ({ folderId, onClose }) => { const intl = useIntl(); const dispatch = useAppDispatch(); const { bookmarkFolder } = useBookmarkFolder(folderId); const { updateBookmarkFolder, isSubmitting } = useUpdateBookmarkFolder(folderId); const [emoji, setEmoji] = useState(bookmarkFolder?.emoji); const [emojiUrl, setEmojiUrl] = useState(bookmarkFolder?.emoji_url); const name = useTextField(bookmarkFolder?.name); const handleEmojiPick = (data: EmojiType) => { if (data.custom) { setEmojiUrl(data.imageUrl); setEmoji(data.colons); } else { setEmoji(data.native); } }; const onClickClose = () => { onClose('EDIT_BOOKMARK_FOLDER'); }; const handleSubmit = () => { updateBookmarkFolder({ name: name.value, emoji, }).then(() => { toast.success(intl.formatMessage(messages.editSuccess)); dispatch(closeModal('EDIT_BOOKMARK_FOLDER')); }) .catch(() => { toast.success(intl.formatMessage(messages.editFail)); }); }; const label = intl.formatMessage(messages.label); return ( } onClose={onClickClose} confirmationAction={handleSubmit} confirmationText={} > ); }; export default EditBookmarkFolderModal;