import type { FC } from '../../lib/teact/teact'; import React, { memo, useCallback, useEffect, useRef, useState, } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; import type { ApiCountryCode, ApiUser, ApiUserStatus } from '../../api/types'; import { getUserStatus } from '../../global/helpers'; import { selectUser, selectUserStatus } from '../../global/selectors'; import { IS_TOUCH_ENV } from '../../util/browser/windowEnvironment'; import { formatPhoneNumberWithCode } from '../../util/phoneNumber'; import renderText from '../common/helpers/renderText'; import useCurrentOrPrev from '../../hooks/useCurrentOrPrev'; import useFlag from '../../hooks/useFlag'; import useOldLang from '../../hooks/useOldLang'; import Avatar from '../common/Avatar'; import Button from '../ui/Button'; import Checkbox from '../ui/Checkbox'; import InputText from '../ui/InputText'; import Modal from '../ui/Modal'; import './NewContactModal.scss'; const ANIMATION_DURATION = 200; export type OwnProps = { isOpen: boolean; userId?: string; isByPhoneNumber?: boolean; }; type StateProps = { user?: ApiUser; userStatus?: ApiUserStatus; phoneCodeList: ApiCountryCode[]; }; const NewContactModal: FC = ({ isOpen, userId, isByPhoneNumber, user, userStatus, phoneCodeList, }) => { const { updateContact, importContact, closeNewContactDialog } = getActions(); const lang = useOldLang(); const renderingUser = useCurrentOrPrev(user); const renderingIsByPhoneNumber = useCurrentOrPrev(isByPhoneNumber); // eslint-disable-next-line no-null/no-null const inputRef = useRef(null); const [isShown, markIsShown, unmarkIsShown] = useFlag(); const [firstName, setFirstName] = useState(renderingUser?.firstName ?? ''); const [lastName, setLastName] = useState(renderingUser?.lastName ?? ''); const [phone, setPhone] = useState(renderingUser?.phoneNumber ?? ''); const [shouldSharePhoneNumber, setShouldSharePhoneNumber] = useState(true); const canBeSubmitted = Boolean(firstName && (!isByPhoneNumber || phone)); useEffect(() => { if (isOpen) { markIsShown(); setFirstName(renderingUser?.firstName ?? ''); setLastName(renderingUser?.lastName ?? ''); setPhone(renderingUser?.phoneNumber ?? ''); setShouldSharePhoneNumber(true); } }, [isOpen, markIsShown, renderingUser?.firstName, renderingUser?.lastName, renderingUser?.phoneNumber]); useEffect(() => { if (!IS_TOUCH_ENV && isShown) { setTimeout(() => { inputRef.current?.focus(); }, ANIMATION_DURATION); } }, [isShown]); const handleFirstNameChange = useCallback((e: React.ChangeEvent) => { setFirstName(e.target.value); }, []); const handlePhoneChange = useCallback((e: React.ChangeEvent) => { setPhone(formatPhoneNumberWithCode(phoneCodeList, e.target.value)); }, [phoneCodeList]); const handleLastNameChange = useCallback((e: React.ChangeEvent) => { setLastName(e.target.value); }, []); const handleClose = useCallback(() => { closeNewContactDialog(); setFirstName(''); setLastName(''); setPhone(''); }, [closeNewContactDialog]); const handleSubmit = useCallback(() => { if (isByPhoneNumber || !userId) { importContact({ firstName, lastName, phoneNumber: phone, }); } else { updateContact({ userId, firstName, lastName, shouldSharePhoneNumber, }); } }, [firstName, importContact, isByPhoneNumber, lastName, phone, shouldSharePhoneNumber, updateContact, userId]); if (!isOpen && !isShown) { return undefined; } function renderAddContact() { return ( <>

{renderingUser?.phoneNumber ? formatPhoneNumberWithCode(phoneCodeList, renderingUser.phoneNumber) : lang('MobileHidden')}

{getUserStatus(lang, renderingUser!, userStatus)}

{renderText( lang('NewContact.Phone.Hidden.Text', renderingUser?.firstName || ''), ['emoji', 'simple_markdown'], )}

{renderText(lang('AddContact.SharedContactExceptionInfo', renderingUser?.firstName))}

); } function renderCreateContact() { return (
); } return ( {renderingUser && renderAddContact()} {renderingIsByPhoneNumber && renderCreateContact()}
); }; export default memo(withGlobal( (global, { userId }): StateProps => { const user = userId ? selectUser(global, userId) : undefined; return { user, userStatus: userId ? selectUserStatus(global, userId) : undefined, phoneCodeList: global.countryList.phoneCodes, }; }, )(NewContactModal));