import { formatSameSiteExtension } from '@ringcentral-integration/phone-number/lib/format'; import { useSleep } from '@ringcentral/juno'; import type { FunctionComponent } from 'react'; import React, { useEffect, useState } from 'react'; import DefaultAvatar from '../../assets/images/DefaultAvatar.svg'; import type { GetPresenceFn } from '../../react-hooks/usePresence'; import { usePresence } from '../../react-hooks/usePresence'; import PlaceholderImage from '../PlaceholderImage'; import PresenceStatusIcon from '../PresenceStatusIcon'; import i18n from './i18n'; import styles from './styles.scss'; interface AvatarNodeProps { name: string; avatarUrl: string; isInactive: boolean; } const AvatarNode: FunctionComponent = ({ name, avatarUrl, isInactive, }) => { const avatarStyle = isInactive ? styles.inactiveAvatarNode : styles.avatarNode; return ( } /> ); }; interface ContactItemProps { currentLocale: string; currentSiteCode: string; isMultipleSiteEnabled: boolean; contact: { id: string; type: string; name: string; extensionNumber: string; email: string; profileImageUrl: string; presence: any; contactStatus: string; }; getAvatarUrl: Function; getPresence: GetPresenceFn; onSelect: Function; sourceNodeRenderer: Function; } const defaultSourceNodeRenderer = () => null; export const ContactItem: FunctionComponent = ({ contact, currentLocale, getPresence, getAvatarUrl, onSelect, currentSiteCode = '', isMultipleSiteEnabled = false, sourceNodeRenderer = defaultSourceNodeRenderer, }) => { const [loading, setLoading] = useState(true); const { sleep: sleepForLoading } = useSleep(); const { sleep: sleepForGettingInfo } = useSleep(); const presence = usePresence(contact, { fetch: getPresence, timeout: 500 }); const onItemSelected = () => { if (onSelect) { onSelect(contact); } }; const renderMiddle = () => { const { name, contactStatus } = contact; if (contactStatus === 'NotActivated') { return (
{name}
{i18n.getString('notActivated', currentLocale)}
); } return (
{name}
); }; useEffect(() => { // TODO: should know why need 3s delay sleepForLoading(3).then(() => { setLoading(false); }); sleepForGettingInfo(500).then(async () => { getAvatarUrl(contact); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (loading) { return
; } const { name, extensionNumber, type, profileImageUrl, contactStatus } = contact; let displayingNumber = extensionNumber; if (isMultipleSiteEnabled) { displayingNumber = formatSameSiteExtension({ currentSiteCode, extension: extensionNumber, }); } const sourceNode = sourceNodeRenderer({ sourceType: type }); return (
{sourceNode ? (
{sourceNode}
) : null} {contactStatus !== 'NotActivated' && presence ? (
) : null}
{renderMiddle()}
{displayingNumber}
); }; export default ContactItem;