import type { ToNumber } from '@ringcentral-integration/commons/modules/ComposeText'; import clsx from 'clsx'; import React, { Component } from 'react'; import FromField from '../FromField'; import MessageInput from '../MessageInput'; import RecipientsInput from '../RecipientsInput'; import { RecipientsInputV2 } from '../RecipientsInputV2'; import { SpinnerOverlay } from '../SpinnerOverlay'; import NoSenderAlert from './NoSenderAlert'; import styles from './styles.scss'; export interface ComposeTextPanelProps { triggerEventTracking: (eventName: string, contactType: string) => any; brand?: string; className?: string; send: (...args: any[]) => any; senderNumbers: { phoneNumber: string; }[]; sendButtonDisabled: boolean; formatPhone: (...args: any[]) => any; formatContactPhone: (...args: any[]) => any; detectPhoneNumbers: (...args: any[]) => any; searchContact: (...args: any[]) => any; searchContactList: { name: string; entityType: string; phoneType: string; phoneNumber: string; }[]; currentLocale: string; updateSenderNumber: (...args: any[]) => any; updateTypingToNumber: (...args: any[]) => any; cleanTypingToNumber: (...args: any[]) => any; addToNumber: (...args: any[]) => any; removeToNumber: (...args: any[]) => any; updateMessageText: (...args: any[]) => any; messageText: string; typingToNumber: string; senderNumber: string; toNumbers: ToNumber[]; outboundSMS?: boolean; showSpinner?: boolean; phoneTypeRenderer?: (...args: any[]) => any; phoneSourceNameRenderer?: (...args: any[]) => any; recipientsContactInfoRenderer?: (...args: any[]) => any; recipientsContactPhoneRenderer?: (...args: any[]) => any; autoFocus?: boolean; inputExpandable?: boolean; supportAttachment?: boolean; supportEmoji?: boolean; attachments?: { name: string; size: number; file: File; }[]; addAttachments?: (...args: any[]) => any; removeAttachment?: (...args: any[]) => any; useRecipientsInputV2?: boolean; showCustomPhoneLabel?: boolean; } type ComposeTextPanelState = { messageText: any; }; class ComposeTextPanel extends Component< ComposeTextPanelProps, ComposeTextPanelState > { addToRecipients: (item: ToNumber) => void; removeFromRecipients: (phoneNumber: string) => void; cleanReceiverValue: () => void; onSenderChange: any; static defaultProps: { brand: 'RingCentral'; className: null; messageText: ''; typingToNumber: ''; senderNumber: ''; outboundSMS: false; showSpinner: false; autoFocus: false; showCustomPhoneLabel: false; supportAttachment: false; supportEmoji: false; }; constructor(props: ComposeTextPanelProps | Readonly) { super(props); this.state = { messageText: props.messageText, }; const { updateSenderNumber, cleanTypingToNumber, addToNumber, removeToNumber, } = this.props; this.onSenderChange = (value: any) => { updateSenderNumber(value); }; this.cleanReceiverValue = () => { cleanTypingToNumber(); }; this.addToRecipients = async (receiver, shouldClean = true) => { const isAdded = await addToNumber(receiver); if (isAdded && shouldClean) { cleanTypingToNumber(); } }; this.removeFromRecipients = (phoneNumber) => { removeToNumber({ phoneNumber }); }; } override UNSAFE_componentWillReceiveProps(nextProps: { messageText: any }) { const { messageText } = this.state; if (nextProps.messageText !== messageText) { this.setState({ messageText: nextProps.messageText, }); } } hasSenderNumbers() { const { senderNumbers } = this.props; return senderNumbers.length > 0; } hasPersonalRecipient() { const { toNumbers } = this.props; return toNumbers.some((x) => x && x.type !== 'company'); } showAlert() { const { outboundSMS } = this.props; return !!( !this.hasSenderNumbers() && outboundSMS && this.hasPersonalRecipient() ); } onInputChange = (searchString: string) => { const { updateTypingToNumber, searchContact } = this.props; updateTypingToNumber(searchString); searchContact(searchString); }; override render() { const { send, brand, autoFocus, className, toNumbers, attachments, formatPhone, messageText, showSpinner, senderNumber, addAttachments, currentLocale, searchContact, senderNumbers, typingToNumber, inputExpandable, removeAttachment, phoneTypeRenderer, searchContactList, supportAttachment, supportEmoji, updateMessageText, detectPhoneNumbers, formatContactPhone, sendButtonDisabled, updateTypingToNumber, // TODO: temporary solution, wait for new component ready useRecipientsInputV2, showCustomPhoneLabel, phoneSourceNameRenderer, recipientsContactInfoRenderer, recipientsContactPhoneRenderer, } = this.props; const filteredSearchContactList = useRecipientsInputV2 && typingToNumber.length >= 3 ? searchContactList : []; return (
{showSpinner ? : null} {useRecipientsInputV2 ? ( ) : ( )}
); } } export default ComposeTextPanel;