import { useCallback, useMemo } from 'react'; import type { FC } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import classNames from 'classnames'; import { changeComposeVisibility } from '@/flavours/glitch/actions/compose'; import { setComposeQuotePolicy } from '@/flavours/glitch/actions/compose_typed'; import { openModal } from '@/flavours/glitch/actions/modal'; import type { ApiQuotePolicy } from '@/flavours/glitch/api_types/quotes'; import type { StatusVisibility } from '@/flavours/glitch/api_types/statuses'; import { Icon } from '@/flavours/glitch/components/icon'; import { useAppSelector, useAppDispatch } from '@/flavours/glitch/store'; import { isFeatureEnabled } from '@/flavours/glitch/utils/environment'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import LockIcon from '@/material-icons/400-24px/lock.svg?react'; import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import QuietTimeIcon from '@/material-icons/400-24px/quiet_time.svg?react'; import type { VisibilityModalCallback } from '../../ui/components/visibility_modal'; import PrivacyDropdownContainer from '../containers/privacy_dropdown_container'; import { messages as privacyMessages } from './privacy_dropdown'; const messages = defineMessages({ anyone_quote: { id: 'privacy.quote.anyone', defaultMessage: '{visibility}, anyone can quote', }, limited_quote: { id: 'privacy.quote.limited', defaultMessage: '{visibility}, quotes limited', }, disabled_quote: { id: 'privacy.quote.disabled', defaultMessage: '{visibility}, quotes disabled', }, }); interface PrivacyDropdownProps { disabled?: boolean; } export const VisibilityButton: FC = (props) => { if (!isFeatureEnabled('outgoing_quotes')) { return ; } return ; }; const visibilityOptions = { public: { icon: 'globe', iconComponent: PublicIcon, value: 'public', text: privacyMessages.public_short, }, unlisted: { icon: 'unlock', iconComponent: QuietTimeIcon, value: 'unlisted', text: privacyMessages.unlisted_short, }, private: { icon: 'lock', iconComponent: LockIcon, value: 'private', text: privacyMessages.private_short, }, direct: { icon: 'at', iconComponent: AlternateEmailIcon, value: 'direct', text: privacyMessages.direct_short, }, }; const PrivacyModalButton: FC = ({ disabled = false }) => { const intl = useIntl(); const quotePolicy = useAppSelector( (state) => state.compose.get('quote_policy') as ApiQuotePolicy, ); const visibility = useAppSelector( (state) => state.compose.get('privacy') as StatusVisibility, ); const { icon, iconComponent } = useMemo(() => { const option = visibilityOptions[visibility]; return { icon: option.icon, iconComponent: option.iconComponent }; }, [visibility]); const text = useMemo(() => { const visibilityText = intl.formatMessage( visibilityOptions[visibility].text, ); if (visibility === 'private' || visibility === 'direct') { return visibilityText; } if (quotePolicy === 'nobody') { return intl.formatMessage(messages.disabled_quote, { visibility: visibilityText, }); } if (quotePolicy !== 'public') { return intl.formatMessage(messages.limited_quote, { visibility: visibilityText, }); } return intl.formatMessage(messages.anyone_quote, { visibility: visibilityText, }); }, [quotePolicy, visibility, intl]); const dispatch = useAppDispatch(); const handleChange: VisibilityModalCallback = useCallback( (newVisibility, newQuotePolicy) => { if (newVisibility !== visibility) { dispatch(changeComposeVisibility(newVisibility)); } if (newQuotePolicy !== quotePolicy) { dispatch(setComposeQuotePolicy(newQuotePolicy)); } }, [dispatch, quotePolicy, visibility], ); const handleOpen = useCallback(() => { dispatch( openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { onChange: handleChange }, }), ); }, [dispatch, handleChange]); return ( ); };