import { useCallback, useMemo } from 'react'; import type { FC } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import classNames from 'classnames'; import type { OffsetValue } from 'react-overlays/esm/usePopper'; import type { ModalType } from '@/mastodon/actions/modal'; import { openModal } from '@/mastodon/actions/modal'; import { Dropdown } from '@/mastodon/components/dropdown_menu'; import { IconButton } from '@/mastodon/components/icon_button'; import type { MenuItem } from '@/mastodon/models/dropdown_menu'; import type { ImageLocation } from '@/mastodon/reducers/slices/profile_edit'; import { selectImageInfo } from '@/mastodon/reducers/slices/profile_edit'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import AddIcon from '@/material-icons/400-24px/add.svg?react'; import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import CameraIcon from '@/material-icons/400-24px/photo_camera.svg?react'; import ReplaceImageIcon from '@/material-icons/400-24px/replace_image.svg?react'; import classes from '../styles.module.scss'; const messages = defineMessages({ add: { id: 'account_edit.image_edit.add_button', defaultMessage: 'Add image', }, replace: { id: 'account_edit.image_edit.replace_button', defaultMessage: 'Replace image', }, altAdd: { id: 'account_edit.image_edit.alt_add_button', description: 'Alt is short for "alternative".', defaultMessage: 'Add alt text', }, altEdit: { id: 'account_edit.image_edit.alt_edit_button', description: 'Alt is short for "alternative".', defaultMessage: 'Edit alt text', }, remove: { id: 'account_edit.image_edit.remove_button', defaultMessage: 'Remove image', }, }); export const AccountImageEdit: FC<{ className?: string; location: ImageLocation; }> = ({ className, location }) => { const intl = useIntl(); const { alt, src } = useAppSelector((state) => selectImageInfo(state, location), ); const hasAlt = !!alt; const dispatch = useAppDispatch(); const handleModal = useCallback( (type: ModalType) => { dispatch(openModal({ modalType: type, modalProps: { location } })); }, [dispatch, location], ); const items = useMemo( () => [ { text: intl.formatMessage(messages.replace), action: () => { handleModal('ACCOUNT_EDIT_IMAGE_UPLOAD'); }, icon: ReplaceImageIcon, }, { text: intl.formatMessage(hasAlt ? messages.altEdit : messages.altAdd), action: () => { handleModal('ACCOUNT_EDIT_IMAGE_ALT'); }, icon: hasAlt ? EditIcon : AddIcon, }, null, { text: intl.formatMessage(messages.remove), action: () => { handleModal('ACCOUNT_EDIT_IMAGE_DELETE'); }, icon: DeleteIcon, dangerous: true, }, ] satisfies MenuItem[], [handleModal, hasAlt, intl], ); const handleAddImage = useCallback(() => { handleModal('ACCOUNT_EDIT_IMAGE_UPLOAD'); }, [handleModal]); const iconClassName = classNames(classes.imageButton, className); if (!src) { return ( ); } return ( ); }; const popperOffset = [0, 6] as OffsetValue;