@nethesis/phone-island 1.1.7 → 1.1.8-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AlertView/index.js +1 -1
- package/dist/components/AlertView/index.js.map +1 -1
- package/dist/components/AudioPlayerView/PlayerFooterActions.js +1 -1
- package/dist/components/AudioPlayerView/PlayerFooterActions.js.map +1 -1
- package/dist/components/AudioPlayerView/Progress.js +1 -1
- package/dist/components/AudioPlayerView/Progress.js.map +1 -1
- package/dist/components/AudioPlayerView/index.js +1 -1
- package/dist/components/AudioPlayerView/index.js.map +1 -1
- package/dist/components/Button.js +1 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/CallView/Actions.js +1 -1
- package/dist/components/CallView/Actions.js.map +1 -1
- package/dist/components/CallView/Number.js +1 -1
- package/dist/components/CallView/Number.js.map +1 -1
- package/dist/components/CallView/index.js +1 -1
- package/dist/components/CallView/index.js.map +1 -1
- package/dist/components/ConferenceView/index.js +1 -1
- package/dist/components/ConferenceView/index.js.map +1 -1
- package/dist/components/ContactView/ContactListView.js +1 -1
- package/dist/components/ContactView/ContactListView.js.map +1 -1
- package/dist/components/ContactView/TransferActions.js +1 -1
- package/dist/components/ContactView/TransferActions.js.map +1 -1
- package/dist/components/CustomThemedTooltip.js.map +1 -1
- package/dist/components/Events.js +1 -1
- package/dist/components/Events.js.map +1 -1
- package/dist/components/Hangup.js +1 -1
- package/dist/components/Hangup.js.map +1 -1
- package/dist/components/Island.js +1 -1
- package/dist/components/Island.js.map +1 -1
- package/dist/components/IslandDrag.js +1 -1
- package/dist/components/IslandDrag.js.map +1 -1
- package/dist/components/IslandMotion.js +1 -1
- package/dist/components/IslandMotion.js.map +1 -1
- package/dist/components/KeypadView/Actions.js +1 -1
- package/dist/components/KeypadView/Actions.js.map +1 -1
- package/dist/components/KeypadView/index.js +1 -1
- package/dist/components/KeypadView/index.js.map +1 -1
- package/dist/components/PhysicalRecorderView/index.js +1 -1
- package/dist/components/PhysicalRecorderView/index.js.map +1 -1
- package/dist/components/RecorderView/Actions.js +1 -1
- package/dist/components/RecorderView/Actions.js.map +1 -1
- package/dist/components/SettingsView/AudioView.js +1 -1
- package/dist/components/SettingsView/AudioView.js.map +1 -1
- package/dist/components/SettingsView/MicrophoneView.js +1 -1
- package/dist/components/SettingsView/MicrophoneView.js.map +1 -1
- package/dist/components/SettingsView/ThemeView.js +1 -1
- package/dist/components/SettingsView/ThemeView.js.map +1 -1
- package/dist/components/SettingsView/VideoInputView.js +1 -1
- package/dist/components/SettingsView/VideoInputView.js.map +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/StreamingAnswerView/index.js +1 -1
- package/dist/components/StreamingAnswerView/index.js.map +1 -1
- package/dist/components/StreamingImage/index.js +1 -1
- package/dist/components/StreamingImage/index.js.map +1 -1
- package/dist/components/StreamingUnlock/index.js +2 -0
- package/dist/components/StreamingUnlock/index.js.map +1 -0
- package/dist/components/StreamingVideo/index.js +2 -0
- package/dist/components/StreamingVideo/index.js.map +1 -0
- package/dist/components/SwitchInputView/DropdownContent.js +1 -1
- package/dist/components/SwitchInputView/DropdownContent.js.map +1 -1
- package/dist/components/SwitchInputView/Index.js +1 -1
- package/dist/components/TranscriptionView/TranscriptionView.js +1 -1
- package/dist/components/TranscriptionView/TranscriptionView.js.map +1 -1
- package/dist/components/TransferButton.js +1 -1
- package/dist/components/TransferButton.js.map +1 -1
- package/dist/components/VideoView/index.js +1 -1
- package/dist/components/VideoView/index.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/events/CallEvents.js +1 -1
- package/dist/events/CallEvents.js.map +1 -1
- package/dist/events/PlayerEvents.js +1 -1
- package/dist/events/PlayerEvents.js.map +1 -1
- package/dist/events/RecorderEvents.js +1 -1
- package/dist/events/RecorderEvents.js.map +1 -1
- package/dist/events/SocketEvents.js +1 -1
- package/dist/events/SocketEvents.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/lib/darkTheme.js +1 -1
- package/dist/lib/darkTheme.js.map +1 -1
- package/dist/lib/devices/devices.js +1 -1
- package/dist/lib/devices/devices.js.map +1 -1
- package/dist/lib/island/island.js +1 -1
- package/dist/lib/island/island.js.map +1 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/lib/phone/video.js +1 -1
- package/dist/lib/phone/video.js.map +1 -1
- package/dist/lib/storage/local_storage.js +1 -1
- package/dist/lib/storage/local_storage.js.map +1 -1
- package/dist/lib/streaming/streamingVideo.js +2 -0
- package/dist/lib/streaming/streamingVideo.js.map +1 -0
- package/dist/lib/streaming/whepPlayer.js +2 -0
- package/dist/lib/streaming/whepPlayer.js.map +1 -0
- package/dist/models/currentCall.js +1 -1
- package/dist/models/currentCall.js.map +1 -1
- package/dist/models/island.js +1 -1
- package/dist/models/island.js.map +1 -1
- package/dist/models/motions.js +1 -1
- package/dist/models/motions.js.map +1 -1
- package/dist/models/streaming.js +1 -1
- package/dist/models/streaming.js.map +1 -1
- package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js +1 -1
- package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js.map +1 -1
- package/dist/node_modules/react-redux/node_modules/react-is/index.js +1 -1
- package/dist/node_modules/tslib/tslib.es6.js +1 -1
- package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +1 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +1 -1
- package/dist/package.json.js +1 -1
- package/dist/public/locales/en/translation.json.js +1 -1
- package/dist/public/locales/it/translation.json.js +1 -1
- package/dist/services/user.js +1 -1
- package/dist/services/user.js.map +1 -1
- package/dist/utils/customHooks/useStreamingAspectRatio.js +2 -0
- package/dist/utils/customHooks/useStreamingAspectRatio.js.map +1 -0
- package/dist/utils/customHooks/useStreamingContentHeight.js +2 -0
- package/dist/utils/customHooks/useStreamingContentHeight.js.map +1 -0
- package/dist/utils/customHooks/useStreamingVideo.js +2 -0
- package/dist/utils/customHooks/useStreamingVideo.js.map +1 -0
- package/dist/utils/streaming/previewSize.js +2 -0
- package/dist/utils/streaming/previewSize.js.map +1 -0
- package/dist/utils/streaming/streamingUtils.js +1 -1
- package/dist/utils/streaming/streamingUtils.js.map +1 -1
- package/dist/utils/streaming/videoSource.js +2 -0
- package/dist/utils/streaming/videoSource.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useCallback, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faCircle,\n faUnlock,\n faUsers,\n} from '@fortawesome/free-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { answerIncomingCall } from '../../lib/phone/call'\nimport { isNumberOnlyName } from '../../lib/phone/conversation'\nimport Avatar from './Avatar'\nimport DeviceIcon, { DEVICE_TOOLTIP_ID } from './DeviceIcon'\nimport NumberPopover from './NumberPopover'\nimport { StyledNumber, StyledTimer } from '../../styles/Island.styles'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\nimport { useTranslation } from 'react-i18next'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport StreamingImage from '../StreamingImage'\nimport VideoStreamingSkeleton from '../VideoStreamingSkeleton'\nimport VideoStreamingEmptyState from '../VideoStreamingEmptyState'\nimport { handleStreamingUnlock } from '../../utils'\nimport { useDispatch } from 'react-redux'\n\nconst onlyDigits = (value?: string) => (value || '').replace(/\\D/g, '')\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\nconst Details = memo(\n ({\n children,\n className = 'pi-gap-1 pi-grid-rows-2',\n }: {\n children: React.ReactNode\n className?: string\n }) => (\n <div className={`pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ${className}`}>\n {children}\n </div>\n ),\n)\nDetails.displayName = 'Details'\n\nconst QueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary dark:pi-text-indigo-400'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-5 pi-w-5' />\n </span>\n )\n },\n)\nQueueBadge.displayName = 'QueueBadge'\n\nconst IncomingQueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n aria-label={tooltipContent || label}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-3 pi-w-3 pi-flex-none' />\n <span className='pi-block pi-max-w-28 pi-truncate'>{label}</span>\n </span>\n )\n },\n)\nIncomingQueueBadge.displayName = 'IncomingQueueBadge'\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const currentCall = useSelector((state: RootState) => state.currentCall)\n const {\n incoming,\n accepted,\n outgoing,\n startTime,\n paused,\n number,\n displayName,\n isRecording,\n streamingSourceNumber,\n queueName,\n queueNumber,\n throughQueue,\n counterpartDeviceType,\n } = currentCall\n\n const { isOpen, isFromStreaming } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const listenState = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude, isListenExtension, isIntrudeExtension } = listenState\n const { data: alertsData } = useSelector((state: RootState) => state.alerts)\n const currentUser = useSelector((state: RootState) => state.currentUser)\n const { videoSources, sourceImages } = useSelector((state: RootState) => state.streaming)\n\n const activeAlerts = useMemo(\n () => Object.values(alertsData).filter((alert: any) => alert.active),\n [alertsData],\n )\n\n const latestAlert = useMemo(\n () => (activeAlerts.length > 0 ? activeAlerts[activeAlerts.length - 1] : null),\n [activeAlerts],\n )\n\n const shouldShowStreamingImage = useMemo(\n () => isFromStreaming && streamingSourceNumber && !accepted,\n [isFromStreaming, streamingSourceNumber, accepted],\n )\n\n // Check if unlock button should be shown and get tooltip text\n const unlockData = useMemo(() => {\n if (!streamingSourceNumber || !videoSources) return { canUnlock: false, tooltipText: '' }\n\n const source = Object.values(videoSources).find(\n (source) => source?.extension === streamingSourceNumber,\n )\n\n const canUnlock = Boolean(source?.cmdOpen && source?.cmdOpen.trim() !== '')\n const tooltipText =\n canUnlock && source ? `${t('VideoStreaming.Open')}: ${source?.description}` : ''\n\n return { canUnlock, tooltipText }\n }, [streamingSourceNumber, videoSources, t])\n\n const isNameNumberOnly = useMemo(() => isNumberOnlyName(displayName), [displayName])\n\n const canRevealNumber = useMemo(\n () => !isNameNumberOnly && onlyDigits(number).length > 0,\n [isNameNumberOnly, number],\n )\n\n const hasCounterpartDevice = Boolean(counterpartDeviceType)\n\n const queueLabel = useMemo(() => queueName || queueNumber || '', [queueName, queueNumber])\n\n const queueTooltipContent = useMemo(() => {\n if (!throughQueue || !queueLabel) {\n return ''\n }\n\n return `${t('Common.Queue')}: ${queueLabel}`\n }, [throughQueue, queueLabel, t])\n\n const shouldShowIncomingQueueBadge = useMemo(\n () => Boolean(incoming && !accepted && throughQueue && queueLabel),\n [accepted, incoming, throughQueue, queueLabel],\n )\n\n const renderLandlinePhoneDiv = useCallback(\n () => (\n <div className='pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate'>\n <FontAwesomeIcon size='sm' icon={faOfficePhone} className='pi-mr-1' />\n <span className='pi-max-w-16 pi-truncate'>\n {currentUser?.default_device?.description || t('Common.Physical phone')}\n </span>\n </div>\n ),\n [currentUser?.default_device?.description, t],\n )\n\n const renderPulseIcon = useCallback(\n (color: string) => {\n const sizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n const innerSizeClasses = !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n const animationSizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n const colorClasses = color === 'red' ? 'pi-bg-red-400' : 'pi-bg-green-400'\n const textColorClasses = color === 'red' ? 'pi-text-red-500' : 'pi-text-green-500'\n\n return (\n <div className={`${sizeClasses} pi-flex pi-justify-center pi-items-center`}>\n <div\n className={`${innerSizeClasses} pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${animationSizeClasses} pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ${colorClasses} pi-opacity-75`}\n ></span>\n <FontAwesomeIcon\n className={`pi-w-4 pi-h-6 pi-rotate-45 ${textColorClasses}`}\n icon={faCircle}\n />\n </div>\n </div>\n )\n },\n [isOpen],\n )\n\n const callViewClasses = useMemo(() => {\n let baseClasses = 'pi-grid pi-items-center'\n\n if (isOpen) {\n baseClasses = shouldShowIncomingQueueBadge ? 'pi-grid pi-items-center' : 'pi-grid pi-items-start'\n\n if (accepted) {\n baseClasses += ' pi-grid-rows-[72px_1fr]'\n } else if (incoming) {\n baseClasses += ' pi-grid-cols-[256px_114px]'\n } else if (outgoing) {\n baseClasses += ' pi-grid-cols-[1fr_84px]'\n }\n }\n\n return shouldShowStreamingImage ? 'pi-flex pi-flex-col' : baseClasses\n }, [isOpen, accepted, incoming, outgoing, shouldShowStreamingImage, shouldShowIncomingQueueBadge])\n\n const topContentClasses = useMemo(() => {\n let columns = ''\n\n if (isOpen && !accepted && outgoing) {\n columns = 'pi-grid-cols-[48px_1fr]'\n } else if (isOpen && !accepted && incoming) {\n columns = 'pi-grid-cols-[48px_1fr_1px]'\n } else if (isOpen && accepted) {\n columns = 'pi-grid-cols-[48px_164px_48px]'\n } else if (!isOpen && !accepted) {\n columns = 'pi-grid-cols-[24px_102px]'\n } else {\n columns = 'pi-grid-cols-[24px_66px_24px]'\n }\n\n const itemsAlign = isOpen && !shouldShowIncomingQueueBadge ? 'start' : 'center'\n\n return `pi-grid ${columns} pi-gap-${isOpen ? '5' : '3'} pi-items-${itemsAlign} pi-justify-center pi-w-full`\n }, [isOpen, accepted, incoming, outgoing, shouldShowIncomingQueueBadge])\n\n const getGridClasses = useMemo(() => {\n if (shouldShowStreamingImage) return 'pi-grid-cols-3'\n if (isAnswerVisible(outgoing, accepted)) return 'pi-grid-cols-2'\n if (accepted) return 'pi-grid-cols-1 pi-justify-items-center'\n return 'pi-grid-cols-1 pi-justify-items-end'\n }, [shouldShowStreamingImage, outgoing, accepted])\n\n const renderStatusIcon = useCallback(() => {\n const iconSizeClass = isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover'\n\n if (isListen) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faEarListen} />\n }\n\n if (isIntrude) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faHandPointUp} />\n }\n\n return <Avatar />\n }, [isOpen, isListen, isIntrude])\n\n const renderWithDeviceIcon = useCallback(\n (content: React.ReactNode, forceRow: boolean) =>\n hasCounterpartDevice || forceRow ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n {hasCounterpartDevice && <DeviceIcon />}\n {content}\n </div>\n ) : (\n content\n ),\n [hasCounterpartDevice],\n )\n\n const renderDetails = useCallback(() => {\n if (!isOpen) return null\n\n if (isIntrude) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Intrude')}\n {isIntrudeExtension ? ` - ${isIntrudeExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isIntrudeExtension ? (\n `${isIntrudeExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (isListen) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Listen')}\n {isListenExtension ? ` - ${isListenExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isListenExtension ? (\n `${isListenExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (shouldShowIncomingQueueBadge) {\n return (\n <Details\n className={\n isNameNumberOnly\n ? 'pi-grid-rows-[20px_24px] pi-gap-0.5'\n : 'pi-grid-rows-[20px_24px_24px] pi-gap-0.5'\n }\n >\n <IncomingQueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n <DisplayName />\n {!isNameNumberOnly && <Number />}\n </Details>\n )\n }\n\n return (\n <Details>\n {accepted && throughQueue && queueLabel ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n <div className='pi-min-w-0 pi-flex-1'>\n <DisplayName />\n </div>\n <QueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n </div>\n ) : (\n <DisplayName />\n )}\n {accepted\n ? renderWithDeviceIcon(\n <>\n {isPhysical() ? (\n renderLandlinePhoneDiv()\n ) : canRevealNumber ? (\n <span className='pi-grid pi-items-center'>\n <StyledTimer\n isOpen={isOpen}\n size='large'\n aria-hidden='true'\n className='pi-invisible pi-col-start-1 pi-row-start-1'\n >\n 00:00:00\n </StyledTimer>\n <span className='pi-col-start-1 pi-row-start-1'>\n <Timer startTime={startTime} isNotAlwaysWhite />\n </span>\n </span>\n ) : (\n <Timer startTime={startTime} isNotAlwaysWhite />\n )}\n {canRevealNumber && <NumberPopover />}\n </>,\n canRevealNumber,\n )\n : renderWithDeviceIcon(\n isNameNumberOnly && (outgoing || incoming) ? (\n <StyledNumber isOpen={isOpen}>\n <span className='dark:pi-text-gray-50 pi-text-gray-600'>\n {outgoing ? t('Call.Calling...') : t('Call.Incoming call')}\n </span>\n </StyledNumber>\n ) : (\n <Number />\n ),\n false,\n )}\n </Details>\n )\n }, [\n incoming,\n outgoing,\n isNameNumberOnly,\n canRevealNumber,\n renderWithDeviceIcon,\n isOpen,\n isIntrude,\n isListen,\n accepted,\n startTime,\n isIntrudeExtension,\n isListenExtension,\n t,\n renderLandlinePhoneDiv,\n accepted,\n throughQueue,\n queueLabel,\n queueTooltipContent,\n shouldShowIncomingQueueBadge,\n ])\n\n const renderAudioIndicator = useCallback(() => {\n if (accepted && isRecording) {\n return renderPulseIcon('red')\n }\n\n if (accepted && remoteAudioStream && !isPhysical()) {\n return (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )\n }\n\n if (accepted && isPhysical()) {\n return renderPulseIcon('green')\n }\n\n return null\n }, [accepted, isRecording, remoteAudioStream, isOpen, paused, renderPulseIcon])\n\n const renderStreamingContent = useCallback(() => {\n // Show skeleton while videoSources are loading or if streaming source number is not set yet\n if (!videoSources || Object.keys(videoSources).length === 0 || !streamingSourceNumber) {\n return <VideoStreamingSkeleton className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // Find the streaming source\n const source = Object.values(videoSources).find(\n (source) => source.extension === streamingSourceNumber,\n )\n\n // If source doesn't exist, show empty state\n if (!source) {\n return <VideoStreamingEmptyState className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // Check if image is available\n const hasImage = sourceImages[source.id] || source.image\n\n // If no image available, show empty state\n if (!hasImage) {\n return <VideoStreamingEmptyState className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // If we have an image, show StreamingImage component\n return <StreamingImage />\n }, [streamingSourceNumber, videoSources, sourceImages])\n\n // Early return AFTER all hooks have been called\n if (latestAlert !== null) {\n return null\n }\n\n const setVideoStreamingAnswer = () => {\n answerIncomingCall()\n // Set view as video streaming answer with a small delay\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n return (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <div className={callViewClasses}>\n {shouldShowStreamingImage ? (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full pi-gap-2'>\n <div className='pi-flex pi-items-center pi-gap-4 pi-min-w-0 pi-flex-1'>\n {renderStatusIcon()}\n <div className='pi-flex pi-flex-col pi-justify-center pi-space-y-2 pi-min-w-0'>\n <DisplayName />\n <Number />\n </div>\n </div>\n\n <div className='pi-flex pi-gap-2 pi-flex-shrink-0'>\n <Hangup description={t('Tooltip.Hangup')} />\n {!outgoing && (\n <Button\n onClick={() => setVideoStreamingAnswer()}\n variant='green'\n data-tooltip-id='tooltip-answer'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faPhone} />\n </Button>\n )}\n {/* Open door button - only show if cmdOpen is valid */}\n {unlockData?.canUnlock && (\n <Button\n variant='default'\n onClick={handleStreamingUnlock}\n data-tooltip-id='tooltip-unlock'\n data-tooltip-content={unlockData?.tooltipText}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faUnlock} />\n </Button>\n )}\n </div>\n </div>\n\n {renderStreamingContent()}\n </>\n ) : (\n <>\n <div className={topContentClasses}>\n {renderStatusIcon()}\n {renderDetails()}\n\n {!isOpen && !accepted && <DisplayName />}\n {!isOpen && accepted && <Timer startTime={startTime} isNotAlwaysWhite />}\n\n {renderAudioIndicator()}\n </div>\n\n {isOpen && (\n <>\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''}`}>\n {accepted && <Actions />}\n <div className={`pi-grid ${getGridClasses} pi-gap-3.5`}>\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n\n {isAnswerVisible(outgoing, accepted) && (\n <Button\n onClick={answerIncomingCall}\n variant='green'\n data-tooltip-id='tooltip-answer-left'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n <CustomThemedTooltip id='tooltip-answer-left' place='left' />\n <CustomThemedTooltip id='tooltip-answer' place='left' />\n <CustomThemedTooltip id='tooltip-unlock' place='left' />\n <CustomThemedTooltip id='tooltip-display-name' place='bottom' />\n <CustomThemedTooltip id='tooltip-queue' place='bottom' />\n <CustomThemedTooltip\n id={DEVICE_TOOLTIP_ID}\n place='right'\n offset={11}\n maxWidth='300px'\n />\n </div>\n )\n}\n\nexport default memo(CallView)\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","Details","memo","_a","children","_b","className","React","createElement","concat","displayName","QueueBadge","label","tooltipContent","undefined","FontAwesomeIcon","icon","faUsers","IncomingQueueBadge","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","streamingSourceNumber","queueName","queueNumber","throughQueue","counterpartDeviceType","island","isOpen","isFromStreaming","remoteAudioStream","webrtc","listenState","listen","isListen","isIntrude","isListenExtension","isIntrudeExtension","alertsData","alerts","currentUser","_c","streaming","videoSources","sourceImages","activeAlerts","useMemo","Object","values","filter","alert","active","latestAlert","length","shouldShowStreamingImage","unlockData","canUnlock","tooltipText","source","find","extension","Boolean","cmdOpen","trim","description","isNameNumberOnly","isNumberOnlyName","canRevealNumber","value","replace","hasCounterpartDevice","queueLabel","queueTooltipContent","shouldShowIncomingQueueBadge","renderLandlinePhoneDiv","useCallback","size","faOfficePhone","default_device","renderPulseIcon","color","sizeClasses","innerSizeClasses","animationSizeClasses","colorClasses","textColorClasses","faCircle","callViewClasses","baseClasses","topContentClasses","itemsAlign","getGridClasses","renderStatusIcon","iconSizeClass","faEarListen","faHandPointUp","Avatar","renderWithDeviceIcon","content","forceRow","DeviceIcon","renderDetails","isPhysical","Timer","isNotAlwaysWhite","DisplayName","Number","Fragment","StyledTimer","NumberPopover","StyledNumber","renderAudioIndicator","AudioBars","audioStream","renderStreamingContent","keys","VideoStreamingSkeleton","id","image","StreamingImage","VideoStreamingEmptyState","Hangup","Button","onClick","answerIncomingCall","setTimeout","setIslandView","variant","faPhone","handleStreamingUnlock","faUnlock","Actions","CustomThemedTooltip","place","DEVICE_TOOLTIP_ID","offset","maxWidth"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useCallback, memo, useState } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faCircle,\n faUsers,\n} from '@fortawesome/free-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { answerIncomingCall } from '../../lib/phone/call'\nimport { isNumberOnlyName } from '../../lib/phone/conversation'\nimport Avatar from './Avatar'\nimport DeviceIcon, { DEVICE_TOOLTIP_ID } from './DeviceIcon'\nimport NumberPopover from './NumberPopover'\nimport { StyledNumber, StyledTimer } from '../../styles/Island.styles'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\nimport { useTranslation } from 'react-i18next'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport StreamingImage from '../StreamingImage'\nimport StreamingVideo from '../StreamingVideo'\nimport StreamingUnlock from '../StreamingUnlock'\nimport VideoStreamingSkeleton from '../VideoStreamingSkeleton'\nimport VideoStreamingEmptyState from '../VideoStreamingEmptyState'\nimport { findVideoSourceByNumber, isRtspVideoSource } from '../../utils/streaming/videoSource'\nimport { useDispatch } from 'react-redux'\nimport { useStreamingAspectRatio } from '../../utils/customHooks/useStreamingAspectRatio'\nimport { getStreamingPreviewBoxRatio } from '../../utils/streaming/previewSize'\nimport { useStreamingContentHeight } from '../../utils/customHooks/useStreamingContentHeight'\n\nconst onlyDigits = (value?: string) => (value || '').replace(/\\D/g, '')\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\nconst Details = memo(\n ({\n children,\n className = 'pi-gap-1 pi-grid-rows-2',\n }: {\n children: React.ReactNode\n className?: string\n }) => (\n <div className={`pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ${className}`}>\n {children}\n </div>\n ),\n)\nDetails.displayName = 'Details'\n\nconst QueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary dark:pi-text-indigo-400'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-5 pi-w-5' />\n </span>\n )\n },\n)\nQueueBadge.displayName = 'QueueBadge'\n\nconst IncomingQueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n aria-label={tooltipContent || label}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-3 pi-w-3 pi-flex-none' />\n <span className='pi-block pi-max-w-28 pi-truncate'>{label}</span>\n </span>\n )\n },\n)\nIncomingQueueBadge.displayName = 'IncomingQueueBadge'\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const currentCall = useSelector((state: RootState) => state.currentCall)\n const {\n incoming,\n accepted,\n outgoing,\n startTime,\n paused,\n number,\n displayName,\n isRecording,\n streamingSourceNumber,\n queueName,\n queueNumber,\n throughQueue,\n counterpartDeviceType,\n } = currentCall\n\n const { isOpen, isFromStreaming } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const listenState = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude, isListenExtension, isIntrudeExtension } = listenState\n const { data: alertsData } = useSelector((state: RootState) => state.alerts)\n const currentUser = useSelector((state: RootState) => state.currentUser)\n const { videoSources, sourceImages, gateChooserOpen } = useSelector(\n (state: RootState) => state.streaming,\n )\n // row below the buttons for the gates of the video source (and the result of an opening)\n const [gatesRow, setGatesRow] = useState<HTMLDivElement | null>(null)\n // the preview shows the whole picture: the available width, the height follows the aspect\n // ratio of the picture\n const previewBoxRatio = getStreamingPreviewBoxRatio(useStreamingAspectRatio())\n\n const activeAlerts = useMemo(\n () => Object.values(alertsData).filter((alert: any) => alert.active),\n [alertsData],\n )\n\n const latestAlert = useMemo(\n () => (activeAlerts.length > 0 ? activeAlerts[activeAlerts.length - 1] : null),\n [activeAlerts],\n )\n\n const shouldShowStreamingImage = useMemo(\n () => isFromStreaming && streamingSourceNumber && !accepted,\n [isFromStreaming, streamingSourceNumber, accepted],\n )\n\n // The video source of the streaming call\n const streamingSource = useMemo(\n () => findVideoSourceByNumber(videoSources, streamingSourceNumber),\n [streamingSourceNumber, videoSources],\n )\n\n const isNameNumberOnly = useMemo(() => isNumberOnlyName(displayName), [displayName])\n\n const canRevealNumber = useMemo(\n () => !isNameNumberOnly && onlyDigits(number).length > 0,\n [isNameNumberOnly, number],\n )\n\n const hasCounterpartDevice = Boolean(counterpartDeviceType)\n\n const queueLabel = useMemo(() => queueName || queueNumber || '', [queueName, queueNumber])\n\n const queueTooltipContent = useMemo(() => {\n if (!throughQueue || !queueLabel) {\n return ''\n }\n\n return `${t('Common.Queue')}: ${queueLabel}`\n }, [throughQueue, queueLabel, t])\n\n const shouldShowIncomingQueueBadge = useMemo(\n () => Boolean(incoming && !accepted && throughQueue && queueLabel),\n [accepted, incoming, throughQueue, queueLabel],\n )\n\n const renderLandlinePhoneDiv = useCallback(\n () => (\n <div className='pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate'>\n <FontAwesomeIcon size='sm' icon={faOfficePhone} className='pi-mr-1' />\n <span className='pi-max-w-16 pi-truncate'>\n {currentUser?.default_device?.description || t('Common.Physical phone')}\n </span>\n </div>\n ),\n [currentUser?.default_device?.description, t],\n )\n\n const renderPulseIcon = useCallback(\n (color: string) => {\n const sizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n const innerSizeClasses = !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n const animationSizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n const colorClasses = color === 'red' ? 'pi-bg-red-400' : 'pi-bg-green-400'\n const textColorClasses = color === 'red' ? 'pi-text-red-500' : 'pi-text-green-500'\n\n return (\n <div className={`${sizeClasses} pi-flex pi-justify-center pi-items-center`}>\n <div\n className={`${innerSizeClasses} pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${animationSizeClasses} pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ${colorClasses} pi-opacity-75`}\n ></span>\n <FontAwesomeIcon\n className={`pi-w-4 pi-h-6 pi-rotate-45 ${textColorClasses}`}\n icon={faCircle}\n />\n </div>\n </div>\n )\n },\n [isOpen],\n )\n\n const callViewClasses = useMemo(() => {\n let baseClasses = 'pi-grid pi-items-center'\n\n if (isOpen) {\n baseClasses = shouldShowIncomingQueueBadge ? 'pi-grid pi-items-center' : 'pi-grid pi-items-start'\n\n if (accepted) {\n baseClasses += ' pi-grid-rows-[72px_1fr]'\n } else if (incoming) {\n baseClasses += ' pi-grid-cols-[256px_114px]'\n } else if (outgoing) {\n baseClasses += ' pi-grid-cols-[1fr_84px]'\n }\n }\n\n return shouldShowStreamingImage ? 'pi-flex pi-flex-col' : baseClasses\n }, [isOpen, accepted, incoming, outgoing, shouldShowStreamingImage, shouldShowIncomingQueueBadge])\n\n const topContentClasses = useMemo(() => {\n let columns = ''\n\n if (isOpen && !accepted && outgoing) {\n columns = 'pi-grid-cols-[48px_1fr]'\n } else if (isOpen && !accepted && incoming) {\n columns = 'pi-grid-cols-[48px_1fr_1px]'\n } else if (isOpen && accepted) {\n columns = 'pi-grid-cols-[48px_164px_48px]'\n } else if (!isOpen && !accepted) {\n columns = 'pi-grid-cols-[24px_102px]'\n } else {\n columns = 'pi-grid-cols-[24px_66px_24px]'\n }\n\n const itemsAlign = isOpen && !shouldShowIncomingQueueBadge ? 'start' : 'center'\n\n return `pi-grid ${columns} pi-gap-${isOpen ? '5' : '3'} pi-items-${itemsAlign} pi-justify-center pi-w-full`\n }, [isOpen, accepted, incoming, outgoing, shouldShowIncomingQueueBadge])\n\n const getGridClasses = useMemo(() => {\n if (shouldShowStreamingImage) return 'pi-grid-cols-3'\n if (isAnswerVisible(outgoing, accepted)) return 'pi-grid-cols-2'\n if (accepted) return 'pi-grid-cols-1 pi-justify-items-center'\n return 'pi-grid-cols-1 pi-justify-items-end'\n }, [shouldShowStreamingImage, outgoing, accepted])\n\n const renderStatusIcon = useCallback(() => {\n const iconSizeClass = isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover'\n\n if (isListen) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faEarListen} />\n }\n\n if (isIntrude) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faHandPointUp} />\n }\n\n return <Avatar />\n }, [isOpen, isListen, isIntrude])\n\n const renderWithDeviceIcon = useCallback(\n (content: React.ReactNode, forceRow: boolean) =>\n hasCounterpartDevice || forceRow ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n {hasCounterpartDevice && <DeviceIcon />}\n {content}\n </div>\n ) : (\n content\n ),\n [hasCounterpartDevice],\n )\n\n const renderDetails = useCallback(() => {\n if (!isOpen) return null\n\n if (isIntrude) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Intrude')}\n {isIntrudeExtension ? ` - ${isIntrudeExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isIntrudeExtension ? (\n `${isIntrudeExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (isListen) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Listen')}\n {isListenExtension ? ` - ${isListenExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isListenExtension ? (\n `${isListenExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (shouldShowIncomingQueueBadge) {\n return (\n <Details\n className={\n isNameNumberOnly\n ? 'pi-grid-rows-[20px_24px] pi-gap-0.5'\n : 'pi-grid-rows-[20px_24px_24px] pi-gap-0.5'\n }\n >\n <IncomingQueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n <DisplayName />\n {!isNameNumberOnly && <Number />}\n </Details>\n )\n }\n\n return (\n <Details>\n {accepted && throughQueue && queueLabel ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n <div className='pi-min-w-0 pi-flex-1'>\n <DisplayName />\n </div>\n <QueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n </div>\n ) : (\n <DisplayName />\n )}\n {accepted\n ? renderWithDeviceIcon(\n <>\n {isPhysical() ? (\n renderLandlinePhoneDiv()\n ) : canRevealNumber ? (\n <span className='pi-grid pi-items-center'>\n <StyledTimer\n isOpen={isOpen}\n size='large'\n aria-hidden='true'\n className='pi-invisible pi-col-start-1 pi-row-start-1'\n >\n 00:00:00\n </StyledTimer>\n <span className='pi-col-start-1 pi-row-start-1'>\n <Timer startTime={startTime} isNotAlwaysWhite />\n </span>\n </span>\n ) : (\n <Timer startTime={startTime} isNotAlwaysWhite />\n )}\n {canRevealNumber && <NumberPopover />}\n </>,\n canRevealNumber,\n )\n : renderWithDeviceIcon(\n isNameNumberOnly && (outgoing || incoming) ? (\n <StyledNumber isOpen={isOpen}>\n <span className='dark:pi-text-gray-50 pi-text-gray-600'>\n {outgoing ? t('Call.Calling...') : t('Call.Incoming call')}\n </span>\n </StyledNumber>\n ) : (\n <Number />\n ),\n false,\n )}\n </Details>\n )\n }, [\n incoming,\n outgoing,\n isNameNumberOnly,\n canRevealNumber,\n renderWithDeviceIcon,\n isOpen,\n isIntrude,\n isListen,\n accepted,\n startTime,\n isIntrudeExtension,\n isListenExtension,\n t,\n renderLandlinePhoneDiv,\n accepted,\n throughQueue,\n queueLabel,\n queueTooltipContent,\n shouldShowIncomingQueueBadge,\n ])\n\n const renderAudioIndicator = useCallback(() => {\n if (accepted && isRecording) {\n return renderPulseIcon('red')\n }\n\n if (accepted && remoteAudioStream && !isPhysical()) {\n return (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )\n }\n\n if (accepted && isPhysical()) {\n return renderPulseIcon('green')\n }\n\n return null\n }, [accepted, isRecording, remoteAudioStream, isOpen, paused, renderPulseIcon])\n\n // the island fits the measured content of the streaming call (see IslandMotion)\n const streamingContentRef = useStreamingContentHeight(\n 'call',\n Boolean(shouldShowStreamingImage && isOpen),\n )\n\n const renderStreamingContent = useCallback(() => {\n // the same box for every state (no jump when the picture arrives): the content fills it\n const previewBox = (content: React.ReactNode) => (\n <div\n className='pi-relative pi-mt-4 pi-w-full pi-flex-shrink-0'\n style={{ aspectRatio: previewBoxRatio }}\n >\n {content}\n </div>\n )\n const fill = 'pi-absolute pi-inset-0'\n\n // Show skeleton while videoSources are loading or if streaming source number is not set yet\n if (!videoSources || Object.keys(videoSources).length === 0 || !streamingSourceNumber) {\n return previewBox(<VideoStreamingSkeleton className={fill} />)\n }\n\n const source = streamingSource\n\n // If source doesn't exist, show empty state\n if (!source) {\n return previewBox(<VideoStreamingEmptyState className={fill} />)\n }\n\n // Live video (only while the island is expanded, the preview is hidden when collapsed)\n if (isRtspVideoSource(source)) {\n return previewBox(\n <div className={fill}>\n <StreamingVideo\n source={source}\n active={isOpen}\n className='pi-h-full pi-w-full pi-rounded-lg pi-border pi-border-gray-300 dark:pi-border-gray-700 pi-bg-black'\n />\n </div>,\n )\n }\n\n // Check if image is available\n const hasImage = sourceImages[source.id] || source.image\n\n // If no image available, show empty state\n if (!hasImage) {\n return previewBox(<VideoStreamingEmptyState className={fill} />)\n }\n\n // If we have an image, show StreamingImage component\n return previewBox(<StreamingImage className={fill} />)\n }, [streamingSourceNumber, videoSources, sourceImages, streamingSource, isOpen, previewBoxRatio])\n\n // Early return AFTER all hooks have been called\n if (latestAlert !== null) {\n return null\n }\n\n const setVideoStreamingAnswer = () => {\n answerIncomingCall()\n // Set view as video streaming answer with a small delay\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n return (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <div className={callViewClasses} ref={shouldShowStreamingImage ? streamingContentRef : undefined}>\n {shouldShowStreamingImage ? (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full pi-gap-2'>\n <div className='pi-flex pi-items-center pi-gap-4 pi-flex-1 pi-min-w-0'>\n {renderStatusIcon()}\n <div className='pi-flex pi-flex-col pi-justify-center pi-space-y-2 pi-min-w-0'>\n <DisplayName />\n <Number />\n </div>\n </div>\n\n <div className='pi-flex pi-gap-2 pi-flex-shrink-0'>\n <Hangup description={t('Tooltip.Hangup')} />\n {!outgoing && (\n <Button\n onClick={() => setVideoStreamingAnswer()}\n variant='green'\n data-tooltip-id='tooltip-answer'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faPhone} />\n </Button>\n )}\n {/* Open door button(s) - only shown when the source has gates */}\n {streamingSource && (\n <StreamingUnlock\n source={streamingSource}\n tooltipId='tooltip-unlock'\n // not on the left: the hangup and answer buttons stay visible\n tooltipPlace='bottom-end'\n // the collapsed island has no room for the gates: expand it\n onChoose={!isOpen ? () => dispatch.island.toggleIsOpen(true) : undefined}\n onChooserChange={dispatch.streaming.setGateChooserOpen}\n gatesContainer={gatesRow}\n />\n )}\n </div>\n </div>\n\n {/* gates of the video source: the island grows by gatesHeight while it is shown */}\n <div\n ref={setGatesRow}\n className={gateChooserOpen ? 'pi-mt-3 pi-flex pi-h-10 pi-w-full' : 'pi-hidden'}\n />\n\n {renderStreamingContent()}\n </>\n ) : (\n <>\n <div className={topContentClasses}>\n {renderStatusIcon()}\n {renderDetails()}\n\n {!isOpen && !accepted && <DisplayName />}\n {!isOpen && accepted && <Timer startTime={startTime} isNotAlwaysWhite />}\n\n {renderAudioIndicator()}\n </div>\n\n {isOpen && (\n <>\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''}`}>\n {accepted && <Actions />}\n <div className={`pi-grid ${getGridClasses} pi-gap-3.5`}>\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n\n {isAnswerVisible(outgoing, accepted) && (\n <Button\n onClick={answerIncomingCall}\n variant='green'\n data-tooltip-id='tooltip-answer-left'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n <CustomThemedTooltip id='tooltip-answer-left' place='left' />\n <CustomThemedTooltip id='tooltip-answer' place='left' />\n <CustomThemedTooltip id='tooltip-display-name' place='bottom' />\n <CustomThemedTooltip id='tooltip-queue' place='bottom' />\n <CustomThemedTooltip\n id={DEVICE_TOOLTIP_ID}\n place='right'\n offset={11}\n maxWidth='300px'\n />\n </div>\n )\n}\n\nexport default memo(CallView)\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","Details","memo","_a","children","_b","className","React","createElement","concat","displayName","QueueBadge","label","tooltipContent","undefined","FontAwesomeIcon","icon","faUsers","IncomingQueueBadge","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","streamingSourceNumber","queueName","queueNumber","throughQueue","counterpartDeviceType","island","isOpen","isFromStreaming","remoteAudioStream","webrtc","listenState","listen","isListen","isIntrude","isListenExtension","isIntrudeExtension","alertsData","alerts","currentUser","_c","streaming","videoSources","sourceImages","gateChooserOpen","_d","useState","gatesRow","setGatesRow","previewBoxRatio","getStreamingPreviewBoxRatio","useStreamingAspectRatio","activeAlerts","useMemo","Object","values","filter","alert","active","latestAlert","length","shouldShowStreamingImage","streamingSource","findVideoSourceByNumber","isNameNumberOnly","isNumberOnlyName","canRevealNumber","value","replace","hasCounterpartDevice","Boolean","queueLabel","queueTooltipContent","shouldShowIncomingQueueBadge","renderLandlinePhoneDiv","useCallback","size","faOfficePhone","default_device","description","renderPulseIcon","color","sizeClasses","innerSizeClasses","animationSizeClasses","colorClasses","textColorClasses","faCircle","callViewClasses","baseClasses","topContentClasses","itemsAlign","getGridClasses","renderStatusIcon","iconSizeClass","faEarListen","faHandPointUp","Avatar","renderWithDeviceIcon","content","forceRow","DeviceIcon","renderDetails","isPhysical","Timer","isNotAlwaysWhite","DisplayName","Number","Fragment","StyledTimer","NumberPopover","StyledNumber","renderAudioIndicator","AudioBars","audioStream","streamingContentRef","useStreamingContentHeight","renderStreamingContent","previewBox","style","aspectRatio","fill","keys","VideoStreamingSkeleton","source","isRtspVideoSource","StreamingVideo","id","image","StreamingImage","VideoStreamingEmptyState","ref","Hangup","Button","onClick","answerIncomingCall","setTimeout","setIslandView","variant","faPhone","StreamingUnlock","tooltipId","tooltipPlace","onChoose","toggleIsOpen","onChooserChange","setGateChooserOpen","gatesContainer","Actions","CustomThemedTooltip","place","DEVICE_TOOLTIP_ID","offset","maxWidth"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var t=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),n=require("../Hangup.js"),a=require("./ConferenceUsersList.js"),i=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),o=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),r=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js");var s=require("../CallView/Timer.js"),c=require("../../lib/phone/call.js"),u=require("../CustomThemedTooltip.js"),d=require("../AudioBars.js"),f=require("../AvatarGroup.js"),m=require("../../node_modules/react-redux/es/hooks/useSelector.js"),p=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=h(e);exports.WaitingConferenceView=function(){var h=m.useSelector(function(e){return e.conference}),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var t=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),n=require("../Hangup.js"),a=require("./ConferenceUsersList.js"),i=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),o=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),r=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js"),require("../../services/user.js");var s=require("../CallView/Timer.js"),c=require("../../lib/phone/call.js"),u=require("../CustomThemedTooltip.js"),d=require("../AudioBars.js"),f=require("../AvatarGroup.js"),m=require("../../node_modules/react-redux/es/hooks/useSelector.js"),p=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=h(e);exports.WaitingConferenceView=function(){var h=m.useSelector(function(e){return e.conference}),v=h.isOwnerInside,C=h.isConferenceMuted,E=h.conferenceStartTime,j=h.conferenceId,g=h.usersList,x=m.useSelector(function(e){return e.island}),N=x.view,q=x.sideViewIsVisible,A=x.isOpen,T=m.useSelector(function(e){return e.webrtc}).remoteAudioStream,I=m.useSelector(function(e){return e.currentCall}),b=I.paused,F=I.muted,M=t.useTranslation().t,S=p.useDispatch(),k=function(){S.island.toggleConferenceList(!0),S.island.setIslandView("transfer"!==N?"transfer":"call"),q&&r.eventDispatch("phone-island-sideview-close",{}),r.eventDispatch("phone-island-call-conference-list-opened",{})},_=e.useCallback(function(){F?c.unmuteCurrentCall():c.muteCurrentCall()},[F]);return w.default.createElement(w.default.Fragment,null,A?w.default.createElement(w.default.Fragment,null,w.default.createElement("div",{className:"pi-flex pi-flex-col pi-w-full"},w.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-text-gray-900 dark:pi-text-gray-50"},w.default.createElement("h1",{className:"pi-text-lg pi-font-medium pi-leading-7 pi-w-full"},M(v?"Conference.Conference":"Conference.Waiting for the conference")),v&&w.default.createElement(s.default,{size:"small",startTime:String(null===Math||void 0===Math?void 0:Math.floor(E/1e3)),isNotAlwaysWhite:!0,isInsideConference:!0})),w.default.createElement(a.ConferenceUsersList,null),w.default.createElement("div",{className:"pi-flex pi-justify-center pi-space-x-6 pi-mt-4"},v?w.default.createElement(w.default.Fragment,null,w.default.createElement(i.Button,{variant:"default",active:F,onClick:_,"data-tooltip-id":"tooltip-mute","data-tooltip-content":M(F?"Tooltip.Unmute":"Tooltip.Mute")},F?w.default.createElement(l.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:o.faMicrophoneSlash}):w.default.createElement(l.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:o.faMicrophone})),w.default.createElement(i.Button,{variant:"default",active:!!C,onClick:function(){j&&(c.muteAllUsersConference(j,C),S.conference.toggleIsConferenceMuted(!C))},"data-tooltip-id":"tooltip-all-user-muted","data-tooltip-content":"".concat(M(C?"Conference.Unmute all participants":"Conference.Mute all participants"))},C?w.default.createElement(l.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:o.faVolumeXmark}):w.default.createElement(l.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:o.faVolumeHigh})),w.default.createElement(i.Button,{"data-stop-propagation":!0,variant:"default",onClick:function(){return k()},"data-tooltip-id":"tooltip-add-user-to-conference","data-tooltip-content":M("Conference.Add participant")||""},w.default.createElement(l.FontAwesomeIcon,{icon:o.faUserPlus,className:"pi-h-6 pi-w-6"}))):w.default.createElement(w.default.Fragment,null,w.default.createElement(i.Button,{variant:"default",className:"pi-w-52 pi-font-medium pi-leading-5",conference:!0,onClick:function(){return S.conference.toggleIsOwnerInside(!0),void setTimeout(function(){c.joinConference()},800)}},w.default.createElement(l.FontAwesomeIcon,{icon:o.faArrowRightToBracket,className:"pi-mr-3"}),M("Conference.Start conference")),w.default.createElement(i.Button,{variant:"default",conference:!0,onClick:function(){return k()},"data-tooltip-id":"tooltip-add-user-to-conference-before-started","data-tooltip-content":M("Conference.Add participant")||"",className:"pi-font-medium"},w.default.createElement(l.FontAwesomeIcon,{icon:o.faUserPlus}))))),w.default.createElement("div",{className:"pi-absolute pi-bottom-4 pi-right-0 pi-w-full pi-pb-2"},w.default.createElement(n.default,null)),w.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"tooltip-add-user-to-conference",place:"top"}),w.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"tooltip-add-user-to-conference-before-started",place:"left"}),w.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"tooltip-all-user-muted",place:"top"})):w.default.createElement("div",{className:"pi-flex-col"},w.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-space-x-1"},w.default.createElement(l.FontAwesomeIcon,{icon:o.faUsers,className:"pi-h-4 pi-w-4"}),w.default.createElement(s.default,{size:"small",startTime:String(null===Math||void 0===Math?void 0:Math.floor(E/1e3)),isNotAlwaysWhite:!0,isInsideConference:!0}),w.default.createElement(d.AudioBars,{audioStream:T,paused:b,size:A?"large":"small"})),w.default.createElement("div",{className:"pi-flex pi-justify-center pi-items-center pi-pt-1"},w.default.createElement(f.default,{usersList:g||{},maxAvatars:5}))))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/ConferenceView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport Hangup from '../Hangup'\nimport ConferenceUsersList from './ConferenceUsersList'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faArrowRightToBracket,\n faMicrophone,\n faMicrophoneSlash,\n faUserPlus,\n faUsers,\n faVolumeHigh,\n faVolumeXmark,\n} from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch } from '../../utils'\nimport Timer from '../CallView/Timer'\nimport { joinConference, muteAllUsersConference } from '../../lib/phone/call'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { AudioBars } from '../AudioBars'\nimport AvatarGroup from '../AvatarGroup'\nimport { muteCurrentCall, unmuteCurrentCall } from '../../lib/phone/call'\n\nexport const WaitingConferenceView: FC<WaitingConferenceViewProps> = () => {\n const { isOwnerInside, isConferenceMuted, conferenceStartTime, conferenceId, usersList } =\n useSelector((state: RootState) => state.conference)\n const { view, sideViewIsVisible, isOpen } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const handleMuteParticipant = () => {\n if (conferenceId) {\n muteAllUsersConference(conferenceId, isConferenceMuted)\n dispatch.conference.toggleIsConferenceMuted(!isConferenceMuted)\n }\n }\n\n const openAddUserListToAddConference = () => {\n // Update island store and set conference list view to true\n dispatch.island.toggleConferenceList(true)\n // Set the island view to transfer list\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n // Check if sideView is visible and close it\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n eventDispatch('phone-island-call-conference-list-opened', {})\n }\n\n const joinOwnerToConference = () => {\n dispatch.conference.toggleIsOwnerInside(true)\n setTimeout(() => {\n joinConference()\n }, 800)\n }\n\n const toggleMute = useCallback(() => {\n muted ? unmuteCurrentCall() : muteCurrentCall()\n }, [muted])\n\n return (\n <>\n {isOpen ? (\n <>\n <div className='pi-flex pi-flex-col pi-w-full'>\n {/* Header */}\n <div className='pi-flex pi-items-center pi-justify-between pi-text-gray-900 dark:pi-text-gray-50'>\n <h1 className='pi-text-lg pi-font-medium pi-leading-7 pi-w-full'>\n {isOwnerInside\n ? t('Conference.Conference')\n : t('Conference.Waiting for the conference')}\n </h1>\n {isOwnerInside && (\n <Timer\n size='small'\n startTime={String(Math?.floor(conferenceStartTime / 1000))}\n isNotAlwaysWhite\n isInsideConference\n />\n )}\n </div>\n\n {/* User waiting list */}\n <ConferenceUsersList />\n <div className='pi-flex pi-justify-center pi-space-x-6 pi-mt-4'>\n {!isOwnerInside ? (\n <>\n <Button\n variant='default'\n className='pi-w-52 pi-font-medium pi-leading-5'\n conference\n onClick={() => joinOwnerToConference()}\n >\n <FontAwesomeIcon icon={faArrowRightToBracket} className='pi-mr-3' />\n {t('Conference.Start conference')}\n </Button>\n <Button\n variant='default'\n conference\n onClick={() => openAddUserListToAddConference()}\n data-tooltip-id='tooltip-add-user-to-conference-before-started'\n data-tooltip-content={t('Conference.Add participant') || ''}\n className='pi-font-medium'\n >\n <FontAwesomeIcon icon={faUserPlus} />\n </Button>\n </>\n ) : (\n <>\n <Button\n variant='default'\n active={muted}\n onClick={toggleMute}\n data-tooltip-id='tooltip-mute'\n data-tooltip-content={muted ? t('Tooltip.Unmute') : t('Tooltip.Mute')}\n >\n {muted ? (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophone} />\n )}\n </Button>\n <Button\n variant='default'\n active={isConferenceMuted ? true : false}\n onClick={() => handleMuteParticipant()}\n data-tooltip-id='tooltip-all-user-muted'\n data-tooltip-content={\n isConferenceMuted\n ? `${t('Conference.Unmute all participants')}`\n : `${t('Conference.Mute all participants')}`\n }\n >\n {isConferenceMuted ? (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faVolumeXmark} />\n ) : (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faVolumeHigh} />\n )}\n </Button>\n <Button\n data-stop-propagation={true}\n variant='default'\n onClick={() => openAddUserListToAddConference()}\n data-tooltip-id='tooltip-add-user-to-conference'\n data-tooltip-content={t('Conference.Add participant') || ''}\n >\n <FontAwesomeIcon icon={faUserPlus} className='pi-h-6 pi-w-6' />\n </Button>\n </>\n )}\n </div>\n </div>\n <div className={`pi-absolute pi-bottom-4 pi-right-0 pi-w-full pi-pb-2`}>\n <Hangup />\n </div>\n <CustomThemedTooltip\n className='pi-z-1000'\n id='tooltip-add-user-to-conference'\n place='top'\n />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='tooltip-add-user-to-conference-before-started'\n place='left'\n />\n <CustomThemedTooltip className='pi-z-1000' id='tooltip-all-user-muted' place='top' />\n </>\n ) : (\n <div className='pi-flex-col'>\n <div className='pi-flex pi-items-center pi-justify-between pi-space-x-1'>\n <FontAwesomeIcon icon={faUsers} className='pi-h-4 pi-w-4' />\n <Timer\n size='small'\n startTime={String(Math?.floor(conferenceStartTime / 1000))}\n isNotAlwaysWhite\n isInsideConference\n />\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n </div>\n <div className='pi-flex pi-justify-center pi-items-center pi-pt-1'>\n <AvatarGroup usersList={usersList || {}} maxAvatars={5} />\n </div>\n </div>\n )}\n </>\n )\n}\n\nexport interface WaitingConferenceViewProps {}\n"],"names":["_a","useSelector","state","conference","isOwnerInside","isConferenceMuted","conferenceStartTime","conferenceId","usersList","_b","island","view","sideViewIsVisible","isOpen","remoteAudioStream","webrtc","_c","currentCall","paused","muted","t","useTranslation","dispatch","useDispatch","openAddUserListToAddConference","toggleConferenceList","setIslandView","eventDispatch","toggleMute","useCallback","unmuteCurrentCall","muteCurrentCall","React","createElement","Fragment","className","Timer","size","startTime","String","Math","floor","isNotAlwaysWhite","isInsideConference","ConferenceUsersList","Button","variant","active","onClick","FontAwesomeIcon","icon","faMicrophoneSlash","faMicrophone","muteAllUsersConference","toggleIsConferenceMuted","concat","faVolumeXmark","faVolumeHigh","faUserPlus","toggleIsOwnerInside","setTimeout","joinConference","faArrowRightToBracket","Hangup","CustomThemedTooltip","id","place","faUsers","AudioBars","audioStream","AvatarGroup","maxAvatars"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/ConferenceView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport Hangup from '../Hangup'\nimport ConferenceUsersList from './ConferenceUsersList'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faArrowRightToBracket,\n faMicrophone,\n faMicrophoneSlash,\n faUserPlus,\n faUsers,\n faVolumeHigh,\n faVolumeXmark,\n} from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch } from '../../utils'\nimport Timer from '../CallView/Timer'\nimport { joinConference, muteAllUsersConference } from '../../lib/phone/call'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { AudioBars } from '../AudioBars'\nimport AvatarGroup from '../AvatarGroup'\nimport { muteCurrentCall, unmuteCurrentCall } from '../../lib/phone/call'\n\nexport const WaitingConferenceView: FC<WaitingConferenceViewProps> = () => {\n const { isOwnerInside, isConferenceMuted, conferenceStartTime, conferenceId, usersList } =\n useSelector((state: RootState) => state.conference)\n const { view, sideViewIsVisible, isOpen } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const handleMuteParticipant = () => {\n if (conferenceId) {\n muteAllUsersConference(conferenceId, isConferenceMuted)\n dispatch.conference.toggleIsConferenceMuted(!isConferenceMuted)\n }\n }\n\n const openAddUserListToAddConference = () => {\n // Update island store and set conference list view to true\n dispatch.island.toggleConferenceList(true)\n // Set the island view to transfer list\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n // Check if sideView is visible and close it\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n eventDispatch('phone-island-call-conference-list-opened', {})\n }\n\n const joinOwnerToConference = () => {\n dispatch.conference.toggleIsOwnerInside(true)\n setTimeout(() => {\n joinConference()\n }, 800)\n }\n\n const toggleMute = useCallback(() => {\n muted ? unmuteCurrentCall() : muteCurrentCall()\n }, [muted])\n\n return (\n <>\n {isOpen ? (\n <>\n <div className='pi-flex pi-flex-col pi-w-full'>\n {/* Header */}\n <div className='pi-flex pi-items-center pi-justify-between pi-text-gray-900 dark:pi-text-gray-50'>\n <h1 className='pi-text-lg pi-font-medium pi-leading-7 pi-w-full'>\n {isOwnerInside\n ? t('Conference.Conference')\n : t('Conference.Waiting for the conference')}\n </h1>\n {isOwnerInside && (\n <Timer\n size='small'\n startTime={String(Math?.floor(conferenceStartTime / 1000))}\n isNotAlwaysWhite\n isInsideConference\n />\n )}\n </div>\n\n {/* User waiting list */}\n <ConferenceUsersList />\n <div className='pi-flex pi-justify-center pi-space-x-6 pi-mt-4'>\n {!isOwnerInside ? (\n <>\n <Button\n variant='default'\n className='pi-w-52 pi-font-medium pi-leading-5'\n conference\n onClick={() => joinOwnerToConference()}\n >\n <FontAwesomeIcon icon={faArrowRightToBracket} className='pi-mr-3' />\n {t('Conference.Start conference')}\n </Button>\n <Button\n variant='default'\n conference\n onClick={() => openAddUserListToAddConference()}\n data-tooltip-id='tooltip-add-user-to-conference-before-started'\n data-tooltip-content={t('Conference.Add participant') || ''}\n className='pi-font-medium'\n >\n <FontAwesomeIcon icon={faUserPlus} />\n </Button>\n </>\n ) : (\n <>\n <Button\n variant='default'\n active={muted}\n onClick={toggleMute}\n data-tooltip-id='tooltip-mute'\n data-tooltip-content={muted ? t('Tooltip.Unmute') : t('Tooltip.Mute')}\n >\n {muted ? (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophone} />\n )}\n </Button>\n <Button\n variant='default'\n active={isConferenceMuted ? true : false}\n onClick={() => handleMuteParticipant()}\n data-tooltip-id='tooltip-all-user-muted'\n data-tooltip-content={\n isConferenceMuted\n ? `${t('Conference.Unmute all participants')}`\n : `${t('Conference.Mute all participants')}`\n }\n >\n {isConferenceMuted ? (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faVolumeXmark} />\n ) : (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faVolumeHigh} />\n )}\n </Button>\n <Button\n data-stop-propagation={true}\n variant='default'\n onClick={() => openAddUserListToAddConference()}\n data-tooltip-id='tooltip-add-user-to-conference'\n data-tooltip-content={t('Conference.Add participant') || ''}\n >\n <FontAwesomeIcon icon={faUserPlus} className='pi-h-6 pi-w-6' />\n </Button>\n </>\n )}\n </div>\n </div>\n <div className={`pi-absolute pi-bottom-4 pi-right-0 pi-w-full pi-pb-2`}>\n <Hangup />\n </div>\n <CustomThemedTooltip\n className='pi-z-1000'\n id='tooltip-add-user-to-conference'\n place='top'\n />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='tooltip-add-user-to-conference-before-started'\n place='left'\n />\n <CustomThemedTooltip className='pi-z-1000' id='tooltip-all-user-muted' place='top' />\n </>\n ) : (\n <div className='pi-flex-col'>\n <div className='pi-flex pi-items-center pi-justify-between pi-space-x-1'>\n <FontAwesomeIcon icon={faUsers} className='pi-h-4 pi-w-4' />\n <Timer\n size='small'\n startTime={String(Math?.floor(conferenceStartTime / 1000))}\n isNotAlwaysWhite\n isInsideConference\n />\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n </div>\n <div className='pi-flex pi-justify-center pi-items-center pi-pt-1'>\n <AvatarGroup usersList={usersList || {}} maxAvatars={5} />\n </div>\n </div>\n )}\n </>\n )\n}\n\nexport interface WaitingConferenceViewProps {}\n"],"names":["_a","useSelector","state","conference","isOwnerInside","isConferenceMuted","conferenceStartTime","conferenceId","usersList","_b","island","view","sideViewIsVisible","isOpen","remoteAudioStream","webrtc","_c","currentCall","paused","muted","t","useTranslation","dispatch","useDispatch","openAddUserListToAddConference","toggleConferenceList","setIslandView","eventDispatch","toggleMute","useCallback","unmuteCurrentCall","muteCurrentCall","React","createElement","Fragment","className","Timer","size","startTime","String","Math","floor","isNotAlwaysWhite","isInsideConference","ConferenceUsersList","Button","variant","active","onClick","FontAwesomeIcon","icon","faMicrophoneSlash","faMicrophone","muteAllUsersConference","toggleIsConferenceMuted","concat","faVolumeXmark","faVolumeHigh","faUserPlus","toggleIsOwnerInside","setTimeout","joinConference","faArrowRightToBracket","Hangup","CustomThemedTooltip","id","place","faUsers","AudioBars","audioStream","AvatarGroup","maxAvatars"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),a=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../../lib/island/island.js"),r=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),l=require("../../lib/phone/call.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var o=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),s=require("../../utils/customHooks/useEventListener.js"),c=require("../../utils/genericFunctions/eventDispatch.js");require("../../store/index.js");var u=require("../CustomThemedTooltip.js"),d=require("../../services/phonebook.js"),p=require("./SelectContactNumberView.js"),m=require("../../node_modules/lodash/debounce.js"),f=require("./ListAvatar.js"),v=require("../../node_modules/react-redux/es/hooks/useSelector.js"),g=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var b=h(t);exports.ContactListView=function(){var h=v.useSelector(function(e){return e.island}),x=h.isOpen,E=h.contactListView,y=v.useSelector(function(e){return e.users}).endpoints,N=v.useSelector(function(e){return e.currentUser}).username,w=t.useState(!1),k=w[0],C=w[1],T=t.useState([]),j=T[0],_=T[1],q=t.useState([]),L=q[0],P=q[1],S=t.useState(),A=S[0],I=S[1],F=t.useState(!0),B=F[0],H=F[1],O=t.useState(""),z=O[0],D=O[1],V=t.useState(),M=V[0],R=V[1],U=t.useRef(null),W=t.useState(!1),$=W[0],G=W[1],J=t.useState(10),K=J[0],Q=J[1],X=g.useDispatch(),Y=v.useSelector(function(e){return e.currentCall}).paused,Z=t.useMemo(function(){return e.__spreadArray(e.__spreadArray([],j,!0),L,!0)},[j,L]),ee=t.useRef(m.default(function(e){ae(e)},300)).current;function te(e){if(void 0===e&&(e=""),e=e.trim().toLowerCase(),y){var t=null==Object?void 0:Object.values(y).filter(function(t){var a,i,n,r,l;return(null==t?void 0:t.username)!==N&&((null===(a=null==t?void 0:t.endpoints)||void 0===a?void 0:a.extension.find(function(t){var a,i;return null===(i=null===(a=null==t?void 0:t.id)||void 0===a?void 0:a.toLowerCase())||void 0===i?void 0:i.startsWith(e)}))||(null===(n=null===(i=null==t?void 0:t.username)||void 0===i?void 0:i.toLowerCase())||void 0===n?void 0:n.includes(e))||(null===(l=null===(r=null==t?void 0:t.name)||void 0===r?void 0:r.toLowerCase())||void 0===l?void 0:l.includes(e)))});_(t)}}function ae(){return e.__awaiter(this,arguments,void 0,function(t){var a,i;return void 0===t&&(t=""),e.__generator(this,function(e){switch(e.label){case 0:C(!1),t=t.trim().toLowerCase(),/^[0-9*#+]+$/.test(t)?R(!0):R(!1),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,d.searchPhonebook(1,t,"")];case 2:return a=e.sent(),P(a.rows),[3,4];case 3:return i=e.sent(),console.error("Error fetching phonebook:",i),[3,4];case 4:return C(!0),[2]}})})}function ie(e){return e&&"object"==typeof e&&"endpoints"in e&&"username"in e}function ne(e){return e&&"object"==typeof e&&"source"in e&&"name"in e}function re(e){var t;return null===(t=["online","voicemail","cellphone","callforward"])||void 0===t?void 0:t.includes(e)}t.useEffect(function(){return function(){ee.cancel()}},[ee]),s.useEventListener("phone-island-call-transfer",function(e){l.handleAttendedTransfer(e.number,X),c.eventDispatch("phone-island-call-transfer-opened",{})}),t.useEffect(function(){y&&N&&(te(z),B&&(ae(z),H(!1)))},[y,N]),t.useEffect(function(){var e,t,a=function(){var e,t,a;G(!!(U.current&&U.current.scrollTop>3)),U.current&&(null===(e=U.current)||void 0===e?void 0:e.offsetHeight)+(null===(t=U.current)||void 0===t?void 0:t.scrollTop)>=(null===(a=U.current)||void 0===a?void 0:a.scrollHeight)-10&&Q(function(e){return e+10})};return x?null===(e=U.current)||void 0===e||e.addEventListener("scroll",a):null===(t=U.current)||void 0===t||t.removeEventListener("scroll",a),function(){var e;return null===(e=U.current)||void 0===e?void 0:e.removeEventListener("scroll",a)}},[x]);var le=o.useTranslation().t,oe=b.default.createElement("div",{className:"pi-relative pi-flex pi-flex-col"},b.default.createElement("div",{className:"pi-relative pi-z-50"},b.default.createElement("div",{className:"pi-flex pi-gap-4"},b.default.createElement(a.Button,{variant:"transparent",onClick:function(){l.isInsideConferenceList()&&c.eventDispatch("phone-island-conference-list-close",{}),Y&&c.eventDispatch("phone-island-call-unhold",{}),n.backToPreviousView()},"data-tooltip-id":"contact-list-tooltip-back-to-call","data-tooltip-content":le("Tooltip.Back to call")||""},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faArrowLeft})),b.default.createElement("input",{"data-stop-propagation":!0,type:"text",onChange:function(e){D(e.currentTarget.value),ee(e.currentTarget.value),te(e.currentTarget.value)},value:z,placeholder:le("Common.Search contact or phone number")||"",autoFocus:!0,spellCheck:!1,className:"pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-sm pi-px-5 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]"}))),!k&&b.default.createElement("div",{className:"pi-mt-6"},Array.from({length:5}).map(function(e,t){return b.default.createElement("div",{key:t,className:"pi-animate-pulse pi-flex pi-items-center pi-space-x-4 pi-px-3 pi-py-1"},b.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center"},b.default.createElement("div",{className:"pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700"})),b.default.createElement("div",{className:"pi-flex pi-flex-col pi-gap-2 pi-w-full"},b.default.createElement("div",{className:"pi-h-3 pi-w-4/5 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700"}),b.default.createElement("div",{className:"pi-h-3 pi-w-1/2 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700"})),b.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center pi-pr-2"},b.default.createElement("div",{className:"pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700"})))})),b.default.createElement("div",{className:k?"":"pi-hidden"},b.default.createElement("div",{className:"pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4"},$&&b.default.createElement("div",{className:"pi-h-6 pi-w-full pi-bg-gradient-to-b dark:pi-from-black pi-from-gray-100 pi-to-transparent pi-z-100"})),b.default.createElement("div",{style:{marginTop:"-22px"},className:"pi-flex pi-flex-col pi-gap-7"},b.default.createElement("div",{style:{height:"17rem"},ref:U,className:"pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25"},M&&b.default.createElement("div",{className:"pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800"},b.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4"},b.default.createElement(f.default,{placeHolderIcon:r.faUser}),b.default.createElement("div",null,b.default.createElement("div",{className:"pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium"},le("Common.Phone number entered")),b.default.createElement("div",{className:"pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300"},z))),b.default.createElement("div",{className:"pi-flex pi-gap-3.5"},b.default.createElement(a.Button,{onClick:function(){return l.clickTransferOrConference(z,X)},variant:"green","data-tooltip-id":"contact-list-tooltip-call-to-transfer","data-tooltip-content":l.isInsideConferenceList()?le("Conference.Add participant"):le("Tooltip.Transfer call")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faPhone})))),Z&&Z.slice(0,K).map(function(e,t){return b.default.createElement("div",{key:t,className:"pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800"},b.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4"},function(){var t,a;return ie(e)?b.default.createElement(b.default.Fragment,null,b.default.createElement(f.default,{username:null==e?void 0:e.username,status:null==e?void 0:e.mainPresence,placeHolderIcon:r.faHeadset}),b.default.createElement("div",null,b.default.createElement("div",{"data-stop-propagation":!0,className:"pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium"},e.name),b.default.createElement("div",{className:"pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300"},null===(a=null===(t=null==e?void 0:e.endpoints)||void 0===t?void 0:t.mainextension[0])||void 0===a?void 0:a.id))):ne(e)?b.default.createElement(b.default.Fragment,null,b.default.createElement(f.default,{placeHolderIcon:"person"===(null==e?void 0:e.kind)?r.faUser:r.faBuilding}),b.default.createElement("div",null,b.default.createElement("div",{"data-stop-propagation":!0,className:"pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium"},(null==e?void 0:e.displayName)||"-"),b.default.createElement("div",{className:"pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300"},b.default.createElement("span",null,d.getMainPhoneNumber(e)||"-"),d.getTotalPhoneNumbers(e)>1&&b.default.createElement("span",{className:"pi-ml-2"},le("Common.plus_x_others",{count:d.getTotalPhoneNumbers(e)-1}))))):void 0}()),b.default.createElement("div",{className:"pi-flex pi-gap-3.5"},ie(e)?b.default.createElement(a.Button,{onClick:function(){var t,a;return re(null==e?void 0:e.mainPresence)&&l.clickTransferOrConference(null===(a=null===(t=null==e?void 0:e.endpoints)||void 0===t?void 0:t.mainextension[0])||void 0===a?void 0:a.id,X)},variant:"green",disabled:!re(null==e?void 0:e.mainPresence),"data-tooltip-id":re(null==e?void 0:e.mainPresence)?"contact-list-tooltip-left":"","data-tooltip-content":l.isInsideConferenceList()?le("Conference.Add participant"):le("Tooltip.Transfer call")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faPhone})):ne(e)?d.getTotalPhoneNumbers(e)<2?b.default.createElement(a.Button,{onClick:function(){return l.clickTransferOrConference(d.getMainPhoneNumber(e),X)},variant:"green",disabled:0==d.getTotalPhoneNumbers(e),"data-tooltip-id":d.getTotalPhoneNumbers(e)>0?"contact-list-tooltip-left":"","data-tooltip-content":l.isInsideConferenceList()?le("Conference.Add participant"):le("Tooltip.Transfer call")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faPhone})):b.default.createElement(a.Button,{onClick:function(){return I(e),void X.island.setContactListView("selectContactNumber")},variant:"transparent","data-tooltip-id":"contact-list-tooltip-left","data-tooltip-content":le("Tooltip.Select phone number")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faAngleRight})):void 0))}),0===Z.length&&!M&&b.default.createElement("p",{className:" pi-font-medium pi-w-full pi-flex pi-justify-center pi-text-sm"},le("No contacts found"))))));return b.default.createElement(b.default.Fragment,null,function(){switch(E){case"main":default:return oe;case"selectContactNumber":return b.default.createElement(p.SelectContactNumberView,{contact:A})}}(),b.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"contact-list-tooltip-left",place:"left"}),b.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"contact-list-tooltip-back-to-call",place:"right"}),b.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"contact-list-tooltip-call-to-transfer",place:"left"}))};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),a=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../../lib/island/island.js"),r=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),l=require("../../lib/phone/call.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var o=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),s=require("../../utils/customHooks/useEventListener.js"),c=require("../../utils/genericFunctions/eventDispatch.js");require("../../store/index.js"),require("../../services/user.js");var u=require("../CustomThemedTooltip.js"),d=require("../../services/phonebook.js"),p=require("./SelectContactNumberView.js"),m=require("../../node_modules/lodash/debounce.js"),f=require("./ListAvatar.js"),v=require("../../node_modules/react-redux/es/hooks/useSelector.js"),g=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var b=h(t);exports.ContactListView=function(){var h=v.useSelector(function(e){return e.island}),x=h.isOpen,E=h.contactListView,y=v.useSelector(function(e){return e.users}).endpoints,N=v.useSelector(function(e){return e.currentUser}).username,w=t.useState(!1),k=w[0],C=w[1],T=t.useState([]),j=T[0],q=T[1],_=t.useState([]),L=_[0],P=_[1],S=t.useState(),A=S[0],I=S[1],F=t.useState(!0),B=F[0],H=F[1],O=t.useState(""),z=O[0],D=O[1],V=t.useState(),M=V[0],R=V[1],U=t.useRef(null),W=t.useState(!1),$=W[0],G=W[1],J=t.useState(10),K=J[0],Q=J[1],X=g.useDispatch(),Y=v.useSelector(function(e){return e.currentCall}).paused,Z=t.useMemo(function(){return e.__spreadArray(e.__spreadArray([],j,!0),L,!0)},[j,L]),ee=t.useRef(m.default(function(e){ae(e)},300)).current;function te(e){if(void 0===e&&(e=""),e=e.trim().toLowerCase(),y){var t=null==Object?void 0:Object.values(y).filter(function(t){var a,i,n,r,l;return(null==t?void 0:t.username)!==N&&((null===(a=null==t?void 0:t.endpoints)||void 0===a?void 0:a.extension.find(function(t){var a,i;return null===(i=null===(a=null==t?void 0:t.id)||void 0===a?void 0:a.toLowerCase())||void 0===i?void 0:i.startsWith(e)}))||(null===(n=null===(i=null==t?void 0:t.username)||void 0===i?void 0:i.toLowerCase())||void 0===n?void 0:n.includes(e))||(null===(l=null===(r=null==t?void 0:t.name)||void 0===r?void 0:r.toLowerCase())||void 0===l?void 0:l.includes(e)))});q(t)}}function ae(){return e.__awaiter(this,arguments,void 0,function(t){var a,i;return void 0===t&&(t=""),e.__generator(this,function(e){switch(e.label){case 0:C(!1),t=t.trim().toLowerCase(),/^[0-9*#+]+$/.test(t)?R(!0):R(!1),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,d.searchPhonebook(1,t,"")];case 2:return a=e.sent(),P(a.rows),[3,4];case 3:return i=e.sent(),console.error("Error fetching phonebook:",i),[3,4];case 4:return C(!0),[2]}})})}function ie(e){return e&&"object"==typeof e&&"endpoints"in e&&"username"in e}function ne(e){return e&&"object"==typeof e&&"source"in e&&"name"in e}function re(e){var t;return null===(t=["online","voicemail","cellphone","callforward"])||void 0===t?void 0:t.includes(e)}t.useEffect(function(){return function(){ee.cancel()}},[ee]),s.useEventListener("phone-island-call-transfer",function(e){l.handleAttendedTransfer(e.number,X),c.eventDispatch("phone-island-call-transfer-opened",{})}),t.useEffect(function(){y&&N&&(te(z),B&&(ae(z),H(!1)))},[y,N]),t.useEffect(function(){var e,t,a=function(){var e,t,a;G(!!(U.current&&U.current.scrollTop>3)),U.current&&(null===(e=U.current)||void 0===e?void 0:e.offsetHeight)+(null===(t=U.current)||void 0===t?void 0:t.scrollTop)>=(null===(a=U.current)||void 0===a?void 0:a.scrollHeight)-10&&Q(function(e){return e+10})};return x?null===(e=U.current)||void 0===e||e.addEventListener("scroll",a):null===(t=U.current)||void 0===t||t.removeEventListener("scroll",a),function(){var e;return null===(e=U.current)||void 0===e?void 0:e.removeEventListener("scroll",a)}},[x]);var le=o.useTranslation().t,oe=b.default.createElement("div",{className:"pi-relative pi-flex pi-flex-col"},b.default.createElement("div",{className:"pi-relative pi-z-50"},b.default.createElement("div",{className:"pi-flex pi-gap-4"},b.default.createElement(a.Button,{variant:"transparent",onClick:function(){l.isInsideConferenceList()&&c.eventDispatch("phone-island-conference-list-close",{}),Y&&c.eventDispatch("phone-island-call-unhold",{}),n.backToPreviousView()},"data-tooltip-id":"contact-list-tooltip-back-to-call","data-tooltip-content":le("Tooltip.Back to call")||""},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faArrowLeft})),b.default.createElement("input",{"data-stop-propagation":!0,type:"text",onChange:function(e){D(e.currentTarget.value),ee(e.currentTarget.value),te(e.currentTarget.value)},value:z,placeholder:le("Common.Search contact or phone number")||"",autoFocus:!0,spellCheck:!1,className:"pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-sm pi-px-5 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]"}))),!k&&b.default.createElement("div",{className:"pi-mt-6"},Array.from({length:5}).map(function(e,t){return b.default.createElement("div",{key:t,className:"pi-animate-pulse pi-flex pi-items-center pi-space-x-4 pi-px-3 pi-py-1"},b.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center"},b.default.createElement("div",{className:"pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700"})),b.default.createElement("div",{className:"pi-flex pi-flex-col pi-gap-2 pi-w-full"},b.default.createElement("div",{className:"pi-h-3 pi-w-4/5 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700"}),b.default.createElement("div",{className:"pi-h-3 pi-w-1/2 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700"})),b.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center pi-pr-2"},b.default.createElement("div",{className:"pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700"})))})),b.default.createElement("div",{className:k?"":"pi-hidden"},b.default.createElement("div",{className:"pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4"},$&&b.default.createElement("div",{className:"pi-h-6 pi-w-full pi-bg-gradient-to-b dark:pi-from-black pi-from-gray-100 pi-to-transparent pi-z-100"})),b.default.createElement("div",{style:{marginTop:"-22px"},className:"pi-flex pi-flex-col pi-gap-7"},b.default.createElement("div",{style:{height:"17rem"},ref:U,className:"pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25"},M&&b.default.createElement("div",{className:"pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800"},b.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4"},b.default.createElement(f.default,{placeHolderIcon:r.faUser}),b.default.createElement("div",null,b.default.createElement("div",{className:"pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium"},le("Common.Phone number entered")),b.default.createElement("div",{className:"pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300"},z))),b.default.createElement("div",{className:"pi-flex pi-gap-3.5"},b.default.createElement(a.Button,{onClick:function(){return l.clickTransferOrConference(z,X)},variant:"green","data-tooltip-id":"contact-list-tooltip-call-to-transfer","data-tooltip-content":l.isInsideConferenceList()?le("Conference.Add participant"):le("Tooltip.Transfer call")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faPhone})))),Z&&Z.slice(0,K).map(function(e,t){return b.default.createElement("div",{key:t,className:"pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800"},b.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4"},function(){var t,a;return ie(e)?b.default.createElement(b.default.Fragment,null,b.default.createElement(f.default,{username:null==e?void 0:e.username,status:null==e?void 0:e.mainPresence,placeHolderIcon:r.faHeadset}),b.default.createElement("div",null,b.default.createElement("div",{"data-stop-propagation":!0,className:"pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium"},e.name),b.default.createElement("div",{className:"pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300"},null===(a=null===(t=null==e?void 0:e.endpoints)||void 0===t?void 0:t.mainextension[0])||void 0===a?void 0:a.id))):ne(e)?b.default.createElement(b.default.Fragment,null,b.default.createElement(f.default,{placeHolderIcon:"person"===(null==e?void 0:e.kind)?r.faUser:r.faBuilding}),b.default.createElement("div",null,b.default.createElement("div",{"data-stop-propagation":!0,className:"pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium"},(null==e?void 0:e.displayName)||"-"),b.default.createElement("div",{className:"pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300"},b.default.createElement("span",null,d.getMainPhoneNumber(e)||"-"),d.getTotalPhoneNumbers(e)>1&&b.default.createElement("span",{className:"pi-ml-2"},le("Common.plus_x_others",{count:d.getTotalPhoneNumbers(e)-1}))))):void 0}()),b.default.createElement("div",{className:"pi-flex pi-gap-3.5"},ie(e)?b.default.createElement(a.Button,{onClick:function(){var t,a;return re(null==e?void 0:e.mainPresence)&&l.clickTransferOrConference(null===(a=null===(t=null==e?void 0:e.endpoints)||void 0===t?void 0:t.mainextension[0])||void 0===a?void 0:a.id,X)},variant:"green",disabled:!re(null==e?void 0:e.mainPresence),"data-tooltip-id":re(null==e?void 0:e.mainPresence)?"contact-list-tooltip-left":"","data-tooltip-content":l.isInsideConferenceList()?le("Conference.Add participant"):le("Tooltip.Transfer call")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faPhone})):ne(e)?d.getTotalPhoneNumbers(e)<2?b.default.createElement(a.Button,{onClick:function(){return l.clickTransferOrConference(d.getMainPhoneNumber(e),X)},variant:"green",disabled:0==d.getTotalPhoneNumbers(e),"data-tooltip-id":d.getTotalPhoneNumbers(e)>0?"contact-list-tooltip-left":"","data-tooltip-content":l.isInsideConferenceList()?le("Conference.Add participant"):le("Tooltip.Transfer call")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faPhone})):b.default.createElement(a.Button,{onClick:function(){return I(e),void X.island.setContactListView("selectContactNumber")},variant:"transparent","data-tooltip-id":"contact-list-tooltip-left","data-tooltip-content":le("Tooltip.Select phone number")},b.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faAngleRight})):void 0))}),0===Z.length&&!M&&b.default.createElement("p",{className:" pi-font-medium pi-w-full pi-flex pi-justify-center pi-text-sm"},le("No contacts found"))))));return b.default.createElement(b.default.Fragment,null,function(){switch(E){case"main":default:return oe;case"selectContactNumber":return b.default.createElement(p.SelectContactNumberView,{contact:A})}}(),b.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"contact-list-tooltip-left",place:"left"}),b.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"contact-list-tooltip-back-to-call",place:"right"}),b.default.createElement(u.CustomThemedTooltip,{className:"pi-z-1000",id:"contact-list-tooltip-call-to-transfer",place:"left"}))};
|
|
2
2
|
//# sourceMappingURL=ContactListView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactListView.js","sources":["../../../src/components/ContactView/ContactListView.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useState, FormEvent, useRef, useMemo } from 'react'\nimport { Button } from '../Button'\nimport { RootState } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { backToPreviousView } from '../../lib/island/island'\nimport {\n faPhone,\n faArrowLeft,\n faUser,\n faBuilding,\n faAngleRight,\n faHeadset,\n} from '@fortawesome/free-solid-svg-icons'\nimport { UserEndpointsTypes } from '../../types'\nimport {\n clickTransferOrConference,\n handleAttendedTransfer,\n isInsideConferenceList,\n} from '../../lib/phone/call'\nimport { Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getMainPhoneNumber, getTotalPhoneNumbers, searchPhonebook } from '../../services/phonebook'\nimport { PhonebookContact } from '../../types/phonebook'\nimport { SelectContactNumberView } from './SelectContactNumberView'\nimport debounce from 'lodash/debounce'\nimport ListAvatar from './ListAvatar'\n\nconst USERS_NUMBER_PER_PAGE = 10\nconst SHOW_LIST_GRADIENT_DISTANCE = 3\n\nexport const ContactListView: FC<ContactListViewProps> = () => {\n const { isOpen, contactListView } = useSelector((state: RootState) => state.island)\n const { endpoints } = useSelector((state: RootState) => state.users)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const [loaded, setLoaded] = useState<boolean>(false)\n const [filteredOperators, setFilteredOperators] = useState<UserEndpointsTypes[]>([])\n const [filteredPhonebookContacts, setFilteredPhonebookContacts] = useState<PhonebookContact[]>([])\n const [currentContact, setCurrentContact] = useState<PhonebookContact>()\n const [firstPhonebookLoading, setFirstPhonebookLoading] = useState(true)\n const [searchQuery, setSearchQuery] = useState('')\n const [showPhoneNumberTyped, setShowPhoneNumberTyped] = useState<boolean>()\n const relativeRef = useRef<HTMLDivElement>(null)\n const [showGradient, setShowGradient] = useState<boolean>(false)\n const [showingUsers, setShowingUsers] = useState<number>(USERS_NUMBER_PER_PAGE)\n const dispatch = useDispatch<Dispatch>()\n const { paused } = useSelector((state: RootState) => state.currentCall)\n\n const filteredContacts = useMemo(() => {\n return [...filteredOperators, ...filteredPhonebookContacts]\n }, [filteredOperators, filteredPhonebookContacts])\n\n // debounce phonebook search\n const debouncedSearchPhonebookContacts = useRef(\n debounce((value: string) => {\n retrievePhonebookContacts(value)\n }, 300), // debounce delay\n ).current\n\n // cleanup the debounce function on unmount\n useEffect(() => {\n return () => {\n debouncedSearchPhonebookContacts.cancel()\n }\n }, [debouncedSearchPhonebookContacts])\n\n function searchQueryChanged(event: FormEvent<HTMLInputElement>) {\n setSearchQuery(event.currentTarget.value)\n debouncedSearchPhonebookContacts(event.currentTarget.value)\n filterOperators(event.currentTarget.value)\n }\n\n function retrieveContacts() {\n filterOperators(searchQuery)\n\n // load phonebook contacts only once\n\n if (firstPhonebookLoading) {\n retrievePhonebookContacts(searchQuery)\n setFirstPhonebookLoading(false)\n }\n }\n\n function filterOperators(textQuery: string = '') {\n textQuery = textQuery.trim().toLowerCase()\n\n if (endpoints) {\n const operators = Object?.values(endpoints).filter(\n (userEndpoints: UserEndpointsTypes) =>\n // Remove the currentUser from the list\n userEndpoints?.username !== username &&\n (userEndpoints?.endpoints?.extension.find((extension) =>\n extension?.id?.toLowerCase()?.startsWith(textQuery),\n ) ||\n userEndpoints?.username?.toLowerCase()?.includes(textQuery) ||\n userEndpoints?.name?.toLowerCase()?.includes(textQuery)),\n )\n setFilteredOperators(operators)\n }\n }\n\n async function retrievePhonebookContacts(textQuery: string = '') {\n setLoaded(false)\n textQuery = textQuery.trim().toLowerCase()\n\n // phone number typed\n\n if (/^[0-9*#+]+$/.test(textQuery)) {\n setShowPhoneNumberTyped(true)\n } else {\n setShowPhoneNumberTyped(false)\n }\n\n // search phonebook\n\n try {\n const phonebookSearchResult = await searchPhonebook(1, textQuery, '')\n setFilteredPhonebookContacts(phonebookSearchResult.rows)\n } catch (error) {\n console.error('Error fetching phonebook:', error)\n }\n setLoaded(true)\n }\n\n useEventListener('phone-island-call-transfer', (data: CallStartTypes) => {\n handleAttendedTransfer(data.number, dispatch)\n eventDispatch('phone-island-call-transfer-opened', {})\n })\n\n // Retrieve\n useEffect(() => {\n if (endpoints && username) {\n retrieveContacts()\n }\n }, [endpoints, username])\n\n useEffect(() => {\n // Handle users list scrolling\n const handleScroll = () => {\n setShowGradient(\n relativeRef.current && relativeRef.current.scrollTop > SHOW_LIST_GRADIENT_DISTANCE\n ? true\n : false,\n )\n // Manage scroll to bottom\n if (\n relativeRef.current &&\n relativeRef.current?.offsetHeight + relativeRef.current?.scrollTop >=\n relativeRef.current?.scrollHeight - 10\n ) {\n // Improve showing users\n setShowingUsers((state) => state + USERS_NUMBER_PER_PAGE)\n }\n }\n // Manage expansion and collapsing\n if (isOpen) {\n relativeRef.current?.addEventListener('scroll', handleScroll)\n } else {\n relativeRef.current?.removeEventListener('scroll', handleScroll)\n }\n return () => relativeRef.current?.removeEventListener('scroll', handleScroll)\n }, [isOpen])\n\n function handleBackClick() {\n if (isInsideConferenceList()) {\n // Close the conference list\n eventDispatch('phone-island-conference-list-close', {})\n }\n // Unhold the call if it was paused during transfer selection\n if (paused) {\n eventDispatch('phone-island-call-unhold', {})\n }\n // Open the call view\n backToPreviousView()\n }\n\n function isUserEndpointsType(obj: any): obj is UserEndpointsTypes {\n return obj && typeof obj === 'object' && 'endpoints' in obj && 'username' in obj\n }\n\n function isPhonebookContact(obj: any): obj is PhonebookContact {\n return obj && typeof obj === 'object' && 'source' in obj && 'name' in obj\n }\n\n function isContactAvailable(mainPresence: string): boolean {\n return ['online', 'voicemail', 'cellphone', 'callforward']?.includes(mainPresence)\n }\n\n function goToSelectNumberView(phonebookContact: PhonebookContact): void {\n setCurrentContact(phonebookContact)\n dispatch.island.setContactListView('selectContactNumber')\n }\n\n const { t } = useTranslation()\n\n const mainView = (\n <div className='pi-relative pi-flex pi-flex-col'>\n {/* Top section */}\n <div className='pi-relative pi-z-50'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={handleBackClick}\n data-tooltip-id='contact-list-tooltip-back-to-call'\n data-tooltip-content={t('Tooltip.Back to call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n onChange={searchQueryChanged}\n value={searchQuery}\n placeholder={t('Common.Search contact or phone number') || ''}\n autoFocus\n spellCheck={false}\n className='pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-sm pi-px-5 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]'\n />\n </div>\n </div>\n {/* skeleton loader */}\n {!loaded && (\n <div className='pi-mt-6'>\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className='pi-animate-pulse pi-flex pi-items-center pi-space-x-4 pi-px-3 pi-py-1'\n >\n <div className='pi-flex pi-items-center pi-justify-center'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-flex-col pi-gap-2 pi-w-full'>\n <div className='pi-h-3 pi-w-4/5 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n <div className='pi-h-3 pi-w-1/2 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-items-center pi-justify-center pi-pr-2'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* contact list */}\n <div className={!loaded ? 'pi-hidden' : ''}>\n {/* List shadow */}\n <div className='pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4'>\n {showGradient && (\n <div className='pi-h-6 pi-w-full pi-bg-gradient-to-b dark:pi-from-black pi-from-gray-100 pi-to-transparent pi-z-100'></div>\n )}\n </div>\n <div style={{ marginTop: '-22px' }} className='pi-flex pi-flex-col pi-gap-7'>\n {/* List section */}\n <div\n style={{ height: '17rem' }}\n ref={relativeRef}\n className='pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'\n >\n {/* The custom searched number */}\n {showPhoneNumberTyped && (\n <div className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'>\n <div className='pi-flex pi-items-center pi-gap-4'>\n <ListAvatar placeHolderIcon={faUser} />\n <div>\n <div className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'>\n {t('Common.Phone number entered')}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {searchQuery}\n </div>\n </div>\n </div>\n <div className='pi-flex pi-gap-3.5'>\n <Button\n onClick={() => clickTransferOrConference(searchQuery, dispatch)}\n variant='green'\n data-tooltip-id='contact-list-tooltip-call-to-transfer'\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n )}\n {/* Operators and phonebook contacts list */}\n {filteredContacts &&\n filteredContacts.slice(0, showingUsers).map((filteredContact, i) => (\n <div\n key={i}\n className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'\n >\n <div className='pi-flex pi-items-center pi-gap-4'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <>\n <ListAvatar\n username={filteredContact?.username}\n status={filteredContact?.mainPresence}\n placeHolderIcon={faHeadset}\n />\n <div>\n <div\n data-stop-propagation={true}\n className={`pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium`}\n >\n {filteredContact.name}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {filteredContact?.endpoints?.mainextension[0]?.id}\n </div>\n </div>\n </>\n )\n } else if (isPhonebookContact(filteredContact)) {\n return (\n <>\n <ListAvatar\n placeHolderIcon={\n filteredContact?.kind === 'person' ? faUser : faBuilding\n }\n />\n <div>\n <div\n data-stop-propagation={true}\n className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'\n >\n {filteredContact?.displayName || '-'}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n <span>{getMainPhoneNumber(filteredContact) || '-'}</span>\n {getTotalPhoneNumbers(filteredContact) > 1 && (\n <span className='pi-ml-2'>\n {t('Common.plus_x_others', {\n count: getTotalPhoneNumbers(filteredContact) - 1,\n })}\n </span>\n )}\n </div>\n </div>\n </>\n )\n }\n })()}\n </div>\n <div className='pi-flex pi-gap-3.5'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <Button\n onClick={() =>\n isContactAvailable(filteredContact?.mainPresence) &&\n clickTransferOrConference(\n filteredContact?.endpoints?.mainextension[0]?.id,\n dispatch,\n )\n }\n variant='green'\n disabled={!isContactAvailable(filteredContact?.mainPresence)}\n data-tooltip-id={\n isContactAvailable(filteredContact?.mainPresence)\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else if (isPhonebookContact(filteredContact)) {\n if (getTotalPhoneNumbers(filteredContact) < 2) {\n return (\n <Button\n onClick={() =>\n clickTransferOrConference(\n getMainPhoneNumber(filteredContact),\n dispatch,\n )\n }\n variant='green'\n disabled={getTotalPhoneNumbers(filteredContact) == 0}\n data-tooltip-id={\n getTotalPhoneNumbers(filteredContact) > 0\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else {\n // change view to show contact numbers\n return (\n <Button\n onClick={() => goToSelectNumberView(filteredContact)}\n variant='transparent'\n data-tooltip-id={'contact-list-tooltip-left'}\n data-tooltip-content={t('Tooltip.Select phone number')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faAngleRight} />\n </Button>\n )\n }\n }\n })()}\n </div>\n </div>\n ))}\n {filteredContacts.length === 0 && !showPhoneNumberTyped && (\n <p className=' pi-font-medium pi-w-full pi-flex pi-justify-center pi-text-sm'>\n {t('No contacts found')}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n\n return (\n <>\n {(() => {\n switch (contactListView) {\n case 'main':\n return mainView\n case 'selectContactNumber':\n return <SelectContactNumberView contact={currentContact} />\n default:\n return mainView\n }\n })()}\n <CustomThemedTooltip className='pi-z-1000' id='contact-list-tooltip-left' place='left' />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-back-to-call'\n place='right'\n />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-call-to-transfer'\n place='left'\n />\n </>\n )\n}\n\ninterface ContactListViewProps {}\n\ninterface CallStartTypes {\n number: string\n}\n"],"names":["_a","useSelector","state","island","isOpen","contactListView","endpoints","users","username","currentUser","_b","useState","loaded","setLoaded","_c","filteredOperators","setFilteredOperators","_d","filteredPhonebookContacts","setFilteredPhonebookContacts","_e","currentContact","setCurrentContact","_f","firstPhonebookLoading","setFirstPhonebookLoading","_g","searchQuery","setSearchQuery","_h","showPhoneNumberTyped","setShowPhoneNumberTyped","relativeRef","useRef","_j","showGradient","setShowGradient","_k","showingUsers","setShowingUsers","dispatch","useDispatch","paused","currentCall","filteredContacts","useMemo","__spreadArray","debouncedSearchPhonebookContacts","debounce","value","retrievePhonebookContacts","current","filterOperators","textQuery","trim","toLowerCase","operators","Object","values","filter","userEndpoints","extension","find","id","startsWith","includes","name","test","searchPhonebook","phonebookSearchResult","sent","rows","console","error","error_1","isUserEndpointsType","obj","isPhonebookContact","isContactAvailable","mainPresence","useEffect","cancel","useEventListener","data","handleAttendedTransfer","number","eventDispatch","handleScroll","scrollTop","offsetHeight","scrollHeight","addEventListener","removeEventListener","t","useTranslation","mainView","React","createElement","className","Button","variant","onClick","isInsideConferenceList","backToPreviousView","FontAwesomeIcon","icon","faArrowLeft","type","onChange","event","currentTarget","placeholder","autoFocus","spellCheck","Array","from","length","map","_","i","key","style","marginTop","height","ref","ListAvatar","placeHolderIcon","faUser","clickTransferOrConference","faPhone","slice","filteredContact","Fragment","status","faHeadset","mainextension","kind","faBuilding","displayName","getMainPhoneNumber","getTotalPhoneNumbers","count","disabled","setContactListView","faAngleRight","SelectContactNumberView","contact","CustomThemedTooltip","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContactListView.js","sources":["../../../src/components/ContactView/ContactListView.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useState, FormEvent, useRef, useMemo } from 'react'\nimport { Button } from '../Button'\nimport { RootState } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { backToPreviousView } from '../../lib/island/island'\nimport {\n faPhone,\n faArrowLeft,\n faUser,\n faBuilding,\n faAngleRight,\n faHeadset,\n} from '@fortawesome/free-solid-svg-icons'\nimport { UserEndpointsTypes } from '../../types'\nimport {\n clickTransferOrConference,\n handleAttendedTransfer,\n isInsideConferenceList,\n} from '../../lib/phone/call'\nimport { Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getMainPhoneNumber, getTotalPhoneNumbers, searchPhonebook } from '../../services/phonebook'\nimport { PhonebookContact } from '../../types/phonebook'\nimport { SelectContactNumberView } from './SelectContactNumberView'\nimport debounce from 'lodash/debounce'\nimport ListAvatar from './ListAvatar'\n\nconst USERS_NUMBER_PER_PAGE = 10\nconst SHOW_LIST_GRADIENT_DISTANCE = 3\n\nexport const ContactListView: FC<ContactListViewProps> = () => {\n const { isOpen, contactListView } = useSelector((state: RootState) => state.island)\n const { endpoints } = useSelector((state: RootState) => state.users)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const [loaded, setLoaded] = useState<boolean>(false)\n const [filteredOperators, setFilteredOperators] = useState<UserEndpointsTypes[]>([])\n const [filteredPhonebookContacts, setFilteredPhonebookContacts] = useState<PhonebookContact[]>([])\n const [currentContact, setCurrentContact] = useState<PhonebookContact>()\n const [firstPhonebookLoading, setFirstPhonebookLoading] = useState(true)\n const [searchQuery, setSearchQuery] = useState('')\n const [showPhoneNumberTyped, setShowPhoneNumberTyped] = useState<boolean>()\n const relativeRef = useRef<HTMLDivElement>(null)\n const [showGradient, setShowGradient] = useState<boolean>(false)\n const [showingUsers, setShowingUsers] = useState<number>(USERS_NUMBER_PER_PAGE)\n const dispatch = useDispatch<Dispatch>()\n const { paused } = useSelector((state: RootState) => state.currentCall)\n\n const filteredContacts = useMemo(() => {\n return [...filteredOperators, ...filteredPhonebookContacts]\n }, [filteredOperators, filteredPhonebookContacts])\n\n // debounce phonebook search\n const debouncedSearchPhonebookContacts = useRef(\n debounce((value: string) => {\n retrievePhonebookContacts(value)\n }, 300), // debounce delay\n ).current\n\n // cleanup the debounce function on unmount\n useEffect(() => {\n return () => {\n debouncedSearchPhonebookContacts.cancel()\n }\n }, [debouncedSearchPhonebookContacts])\n\n function searchQueryChanged(event: FormEvent<HTMLInputElement>) {\n setSearchQuery(event.currentTarget.value)\n debouncedSearchPhonebookContacts(event.currentTarget.value)\n filterOperators(event.currentTarget.value)\n }\n\n function retrieveContacts() {\n filterOperators(searchQuery)\n\n // load phonebook contacts only once\n\n if (firstPhonebookLoading) {\n retrievePhonebookContacts(searchQuery)\n setFirstPhonebookLoading(false)\n }\n }\n\n function filterOperators(textQuery: string = '') {\n textQuery = textQuery.trim().toLowerCase()\n\n if (endpoints) {\n const operators = Object?.values(endpoints).filter(\n (userEndpoints: UserEndpointsTypes) =>\n // Remove the currentUser from the list\n userEndpoints?.username !== username &&\n (userEndpoints?.endpoints?.extension.find((extension) =>\n extension?.id?.toLowerCase()?.startsWith(textQuery),\n ) ||\n userEndpoints?.username?.toLowerCase()?.includes(textQuery) ||\n userEndpoints?.name?.toLowerCase()?.includes(textQuery)),\n )\n setFilteredOperators(operators)\n }\n }\n\n async function retrievePhonebookContacts(textQuery: string = '') {\n setLoaded(false)\n textQuery = textQuery.trim().toLowerCase()\n\n // phone number typed\n\n if (/^[0-9*#+]+$/.test(textQuery)) {\n setShowPhoneNumberTyped(true)\n } else {\n setShowPhoneNumberTyped(false)\n }\n\n // search phonebook\n\n try {\n const phonebookSearchResult = await searchPhonebook(1, textQuery, '')\n setFilteredPhonebookContacts(phonebookSearchResult.rows)\n } catch (error) {\n console.error('Error fetching phonebook:', error)\n }\n setLoaded(true)\n }\n\n useEventListener('phone-island-call-transfer', (data: CallStartTypes) => {\n handleAttendedTransfer(data.number, dispatch)\n eventDispatch('phone-island-call-transfer-opened', {})\n })\n\n // Retrieve\n useEffect(() => {\n if (endpoints && username) {\n retrieveContacts()\n }\n }, [endpoints, username])\n\n useEffect(() => {\n // Handle users list scrolling\n const handleScroll = () => {\n setShowGradient(\n relativeRef.current && relativeRef.current.scrollTop > SHOW_LIST_GRADIENT_DISTANCE\n ? true\n : false,\n )\n // Manage scroll to bottom\n if (\n relativeRef.current &&\n relativeRef.current?.offsetHeight + relativeRef.current?.scrollTop >=\n relativeRef.current?.scrollHeight - 10\n ) {\n // Improve showing users\n setShowingUsers((state) => state + USERS_NUMBER_PER_PAGE)\n }\n }\n // Manage expansion and collapsing\n if (isOpen) {\n relativeRef.current?.addEventListener('scroll', handleScroll)\n } else {\n relativeRef.current?.removeEventListener('scroll', handleScroll)\n }\n return () => relativeRef.current?.removeEventListener('scroll', handleScroll)\n }, [isOpen])\n\n function handleBackClick() {\n if (isInsideConferenceList()) {\n // Close the conference list\n eventDispatch('phone-island-conference-list-close', {})\n }\n // Unhold the call if it was paused during transfer selection\n if (paused) {\n eventDispatch('phone-island-call-unhold', {})\n }\n // Open the call view\n backToPreviousView()\n }\n\n function isUserEndpointsType(obj: any): obj is UserEndpointsTypes {\n return obj && typeof obj === 'object' && 'endpoints' in obj && 'username' in obj\n }\n\n function isPhonebookContact(obj: any): obj is PhonebookContact {\n return obj && typeof obj === 'object' && 'source' in obj && 'name' in obj\n }\n\n function isContactAvailable(mainPresence: string): boolean {\n return ['online', 'voicemail', 'cellphone', 'callforward']?.includes(mainPresence)\n }\n\n function goToSelectNumberView(phonebookContact: PhonebookContact): void {\n setCurrentContact(phonebookContact)\n dispatch.island.setContactListView('selectContactNumber')\n }\n\n const { t } = useTranslation()\n\n const mainView = (\n <div className='pi-relative pi-flex pi-flex-col'>\n {/* Top section */}\n <div className='pi-relative pi-z-50'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={handleBackClick}\n data-tooltip-id='contact-list-tooltip-back-to-call'\n data-tooltip-content={t('Tooltip.Back to call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n onChange={searchQueryChanged}\n value={searchQuery}\n placeholder={t('Common.Search contact or phone number') || ''}\n autoFocus\n spellCheck={false}\n className='pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-sm pi-px-5 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]'\n />\n </div>\n </div>\n {/* skeleton loader */}\n {!loaded && (\n <div className='pi-mt-6'>\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className='pi-animate-pulse pi-flex pi-items-center pi-space-x-4 pi-px-3 pi-py-1'\n >\n <div className='pi-flex pi-items-center pi-justify-center'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-flex-col pi-gap-2 pi-w-full'>\n <div className='pi-h-3 pi-w-4/5 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n <div className='pi-h-3 pi-w-1/2 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-items-center pi-justify-center pi-pr-2'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* contact list */}\n <div className={!loaded ? 'pi-hidden' : ''}>\n {/* List shadow */}\n <div className='pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4'>\n {showGradient && (\n <div className='pi-h-6 pi-w-full pi-bg-gradient-to-b dark:pi-from-black pi-from-gray-100 pi-to-transparent pi-z-100'></div>\n )}\n </div>\n <div style={{ marginTop: '-22px' }} className='pi-flex pi-flex-col pi-gap-7'>\n {/* List section */}\n <div\n style={{ height: '17rem' }}\n ref={relativeRef}\n className='pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'\n >\n {/* The custom searched number */}\n {showPhoneNumberTyped && (\n <div className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'>\n <div className='pi-flex pi-items-center pi-gap-4'>\n <ListAvatar placeHolderIcon={faUser} />\n <div>\n <div className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'>\n {t('Common.Phone number entered')}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {searchQuery}\n </div>\n </div>\n </div>\n <div className='pi-flex pi-gap-3.5'>\n <Button\n onClick={() => clickTransferOrConference(searchQuery, dispatch)}\n variant='green'\n data-tooltip-id='contact-list-tooltip-call-to-transfer'\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n )}\n {/* Operators and phonebook contacts list */}\n {filteredContacts &&\n filteredContacts.slice(0, showingUsers).map((filteredContact, i) => (\n <div\n key={i}\n className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'\n >\n <div className='pi-flex pi-items-center pi-gap-4'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <>\n <ListAvatar\n username={filteredContact?.username}\n status={filteredContact?.mainPresence}\n placeHolderIcon={faHeadset}\n />\n <div>\n <div\n data-stop-propagation={true}\n className={`pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium`}\n >\n {filteredContact.name}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {filteredContact?.endpoints?.mainextension[0]?.id}\n </div>\n </div>\n </>\n )\n } else if (isPhonebookContact(filteredContact)) {\n return (\n <>\n <ListAvatar\n placeHolderIcon={\n filteredContact?.kind === 'person' ? faUser : faBuilding\n }\n />\n <div>\n <div\n data-stop-propagation={true}\n className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'\n >\n {filteredContact?.displayName || '-'}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n <span>{getMainPhoneNumber(filteredContact) || '-'}</span>\n {getTotalPhoneNumbers(filteredContact) > 1 && (\n <span className='pi-ml-2'>\n {t('Common.plus_x_others', {\n count: getTotalPhoneNumbers(filteredContact) - 1,\n })}\n </span>\n )}\n </div>\n </div>\n </>\n )\n }\n })()}\n </div>\n <div className='pi-flex pi-gap-3.5'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <Button\n onClick={() =>\n isContactAvailable(filteredContact?.mainPresence) &&\n clickTransferOrConference(\n filteredContact?.endpoints?.mainextension[0]?.id,\n dispatch,\n )\n }\n variant='green'\n disabled={!isContactAvailable(filteredContact?.mainPresence)}\n data-tooltip-id={\n isContactAvailable(filteredContact?.mainPresence)\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else if (isPhonebookContact(filteredContact)) {\n if (getTotalPhoneNumbers(filteredContact) < 2) {\n return (\n <Button\n onClick={() =>\n clickTransferOrConference(\n getMainPhoneNumber(filteredContact),\n dispatch,\n )\n }\n variant='green'\n disabled={getTotalPhoneNumbers(filteredContact) == 0}\n data-tooltip-id={\n getTotalPhoneNumbers(filteredContact) > 0\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else {\n // change view to show contact numbers\n return (\n <Button\n onClick={() => goToSelectNumberView(filteredContact)}\n variant='transparent'\n data-tooltip-id={'contact-list-tooltip-left'}\n data-tooltip-content={t('Tooltip.Select phone number')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faAngleRight} />\n </Button>\n )\n }\n }\n })()}\n </div>\n </div>\n ))}\n {filteredContacts.length === 0 && !showPhoneNumberTyped && (\n <p className=' pi-font-medium pi-w-full pi-flex pi-justify-center pi-text-sm'>\n {t('No contacts found')}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n\n return (\n <>\n {(() => {\n switch (contactListView) {\n case 'main':\n return mainView\n case 'selectContactNumber':\n return <SelectContactNumberView contact={currentContact} />\n default:\n return mainView\n }\n })()}\n <CustomThemedTooltip className='pi-z-1000' id='contact-list-tooltip-left' place='left' />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-back-to-call'\n place='right'\n />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-call-to-transfer'\n place='left'\n />\n </>\n )\n}\n\ninterface ContactListViewProps {}\n\ninterface CallStartTypes {\n number: string\n}\n"],"names":["_a","useSelector","state","island","isOpen","contactListView","endpoints","users","username","currentUser","_b","useState","loaded","setLoaded","_c","filteredOperators","setFilteredOperators","_d","filteredPhonebookContacts","setFilteredPhonebookContacts","_e","currentContact","setCurrentContact","_f","firstPhonebookLoading","setFirstPhonebookLoading","_g","searchQuery","setSearchQuery","_h","showPhoneNumberTyped","setShowPhoneNumberTyped","relativeRef","useRef","_j","showGradient","setShowGradient","_k","showingUsers","setShowingUsers","dispatch","useDispatch","paused","currentCall","filteredContacts","useMemo","__spreadArray","debouncedSearchPhonebookContacts","debounce","value","retrievePhonebookContacts","current","filterOperators","textQuery","trim","toLowerCase","operators","Object","values","filter","userEndpoints","extension","find","id","startsWith","includes","name","test","searchPhonebook","phonebookSearchResult","sent","rows","console","error","error_1","isUserEndpointsType","obj","isPhonebookContact","isContactAvailable","mainPresence","useEffect","cancel","useEventListener","data","handleAttendedTransfer","number","eventDispatch","handleScroll","scrollTop","offsetHeight","scrollHeight","addEventListener","removeEventListener","t","useTranslation","mainView","React","createElement","className","Button","variant","onClick","isInsideConferenceList","backToPreviousView","FontAwesomeIcon","icon","faArrowLeft","type","onChange","event","currentTarget","placeholder","autoFocus","spellCheck","Array","from","length","map","_","i","key","style","marginTop","height","ref","ListAvatar","placeHolderIcon","faUser","clickTransferOrConference","faPhone","slice","filteredContact","Fragment","status","faHeadset","mainextension","kind","faBuilding","displayName","getMainPhoneNumber","getTotalPhoneNumbers","count","disabled","setContactListView","faAngleRight","SelectContactNumberView","contact","CustomThemedTooltip","place"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js"),s=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),r=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),i=require("../../lib/webrtc/messages.js"),n=require("../../store/index.js");require("../../node_modules/react-redux/es/index.js");var o=require("../../static/outgoing_ringtone.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var a=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),u=require("../../utils/customHooks/useEventListener.js"),l=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/tslib/tslib.es6.js");var d=require("../CustomThemedTooltip.js"),c=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(e);exports.TransferActions=function(){var e=c.useDispatch(),m=p.useSelector(function(e){return e.currentCall});function j(){e.currentCall.updateTransferSwitching(!0),i.sendDTMF("*"),n.store.getState().player.audioPlayerPlaying||e.player.updateStartAudioPlayer({src:o.default,loop:!0}),setTimeout(function(){i.sendDTMF("4"),e.player.stopAudioPlayer(),l.eventDispatch("phone-island-call-transfer-switched",{})},500)}m.transferCalls,m.number,u.useEventListener("phone-island-call-transfer-switch",function(){j()});var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js"),s=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),r=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),i=require("../../lib/webrtc/messages.js"),n=require("../../store/index.js");require("../../node_modules/react-redux/es/index.js");var o=require("../../static/outgoing_ringtone.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var a=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),u=require("../../utils/customHooks/useEventListener.js"),l=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../services/user.js");var d=require("../CustomThemedTooltip.js"),c=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(e);exports.TransferActions=function(){var e=c.useDispatch(),m=p.useSelector(function(e){return e.currentCall});function j(){e.currentCall.updateTransferSwitching(!0),i.sendDTMF("*"),n.store.getState().player.audioPlayerPlaying||e.player.updateStartAudioPlayer({src:o.default,loop:!0}),setTimeout(function(){i.sendDTMF("4"),e.player.stopAudioPlayer(),l.eventDispatch("phone-island-call-transfer-switched",{})},500)}m.transferCalls,m.number,u.useEventListener("phone-island-call-transfer-switch",function(){j()});var q=a.useTranslation().t;return f.default.createElement(f.default.Fragment,null,f.default.createElement("div",{className:"pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},f.default.createElement("div",null),f.default.createElement(t.Button,{onClick:j,variant:"default","data-tooltip-id":"transfer-actions-tooltip","data-tooltip-content":q("Tooltip.Switch call")||""},f.default.createElement(s.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faArrowsRepeat})),f.default.createElement("div",null)),f.default.createElement(d.CustomThemedTooltip,{className:"pi-z-1000",id:"transfer-actions-tooltip",place:"bottom"}))};
|
|
2
2
|
//# sourceMappingURL=TransferActions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransferActions.js","sources":["../../../src/components/ContactView/TransferActions.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowsRepeat } from '@nethesis/nethesis-solid-svg-icons'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store, Dispatch } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { RootState } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\n//// TODO this component and related events seems unused, remove?\n\nexport const TransferActions: FC<TransferActionsProps> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { transferCalls, number } = useSelector((state: RootState) => state.currentCall)\n\n // Cancels the current transfer through dtmfs\n function switchTransfer() {\n dispatch.currentCall.updateTransferSwitching(true)\n // Start sending the DTMFs for transferring\n sendDTMF('*')\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n setTimeout(() => {\n // Send the second DTMF for transferring\n sendDTMF('4')\n dispatch.player.stopAudioPlayer()\n\n eventDispatch('phone-island-call-transfer-switched', {})\n }, 500)\n }\n useEventListener('phone-island-call-transfer-switch', () => {\n switchTransfer()\n })\n\n const { t } = useTranslation()\n\n return (\n <>\n <div className='pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <div></div>\n <Button\n onClick={switchTransfer}\n variant='default'\n data-tooltip-id='transfer-actions-tooltip'\n data-tooltip-content={t('Tooltip.Switch call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowsRepeat} />\n </Button>\n <div></div>\n </div>\n <CustomThemedTooltip className='pi-z-1000' id='transfer-actions-tooltip' place='bottom' />\n </>\n )\n}\n\ninterface TransferActionsProps {}\n\ninterface CurrentCallsTypes {\n [name: string]: {\n name: string\n time: string\n }\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","currentCall","switchTransfer","updateTransferSwitching","sendDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","eventDispatch","useEventListener","t","useTranslation","React","createElement","Fragment","className","Button","onClick","variant","FontAwesomeIcon","icon","faArrowsRepeat","CustomThemedTooltip","id","place"],"mappings":"
|
|
1
|
+
{"version":3,"file":"TransferActions.js","sources":["../../../src/components/ContactView/TransferActions.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowsRepeat } from '@nethesis/nethesis-solid-svg-icons'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store, Dispatch } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { RootState } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\n//// TODO this component and related events seems unused, remove?\n\nexport const TransferActions: FC<TransferActionsProps> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { transferCalls, number } = useSelector((state: RootState) => state.currentCall)\n\n // Cancels the current transfer through dtmfs\n function switchTransfer() {\n dispatch.currentCall.updateTransferSwitching(true)\n // Start sending the DTMFs for transferring\n sendDTMF('*')\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n setTimeout(() => {\n // Send the second DTMF for transferring\n sendDTMF('4')\n dispatch.player.stopAudioPlayer()\n\n eventDispatch('phone-island-call-transfer-switched', {})\n }, 500)\n }\n useEventListener('phone-island-call-transfer-switch', () => {\n switchTransfer()\n })\n\n const { t } = useTranslation()\n\n return (\n <>\n <div className='pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <div></div>\n <Button\n onClick={switchTransfer}\n variant='default'\n data-tooltip-id='transfer-actions-tooltip'\n data-tooltip-content={t('Tooltip.Switch call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowsRepeat} />\n </Button>\n <div></div>\n </div>\n <CustomThemedTooltip className='pi-z-1000' id='transfer-actions-tooltip' place='bottom' />\n </>\n )\n}\n\ninterface TransferActionsProps {}\n\ninterface CurrentCallsTypes {\n [name: string]: {\n name: string\n time: string\n }\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","currentCall","switchTransfer","updateTransferSwitching","sendDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","eventDispatch","useEventListener","t","useTranslation","React","createElement","Fragment","className","Button","onClick","variant","FontAwesomeIcon","icon","faArrowsRepeat","CustomThemedTooltip","id","place"],"mappings":"inCAkByD,WACvD,IAAMA,EAAWC,EAAAA,cACXC,EAA4BC,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMC,WAAN,GAGpE,SAASC,IACPN,EAASK,YAAYE,yBAAwB,GAE7CC,EAAQA,SAAC,KACsBC,EAAKA,MAACC,WAAWC,OAAMC,oBAGpDZ,EAASW,OAAOE,uBAAuB,CACrCC,IAAKC,EAAgB,QACrBC,MAAM,IAGVC,WAAW,WAETT,EAAQA,SAAC,KACTR,EAASW,OAAOO,kBAEhBC,gBAAc,sCAAuC,CAAA,EACtD,EAAE,IACJ,0BACDC,EAAgBA,iBAAC,oCAAqC,WACpDd,GACF,GAEQ,IAAAe,EAAMC,qBAEd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,sHACbH,UAAWC,cAAA,MAAA,MACXD,EAAAA,QAAAC,cAACG,EAAAA,OACC,CAAAC,QAAStB,EACTuB,QAAQ,UAAS,kBACD,2BACM,uBAAAR,EAAE,wBAA0B,IAElDE,UAACC,cAAAM,EAAAA,gBAAgB,CAAAJ,UAAU,gBAAgBK,KAAMC,EAAcA,kBAEjET,EAAAA,QAAAC,cAAA,MAAA,OAEFD,EAAAA,QAAAC,cAACS,sBAAoB,CAAAP,UAAU,YAAYQ,GAAG,2BAA2BC,MAAM,WAGrF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomThemedTooltip.js","sources":["../../src/components/CustomThemedTooltip.tsx"],"sourcesContent":["// src/components/CustomThemedTooltip.tsx\nimport React, { FC, ReactNode } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Tooltip, type ITooltip } from 'react-tooltip'\n\ninterface CustomThemedTooltipProps {\n id: string\n place?: '
|
|
1
|
+
{"version":3,"file":"CustomThemedTooltip.js","sources":["../../src/components/CustomThemedTooltip.tsx"],"sourcesContent":["// src/components/CustomThemedTooltip.tsx\nimport React, { FC, ReactNode } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Tooltip, type ITooltip } from 'react-tooltip'\n\ninterface CustomThemedTooltipProps {\n id: string\n place?: ITooltip['place']\n className?: string\n openOnClick?: boolean\n clickable?: boolean\n globalCloseEvents?: ITooltip['globalCloseEvents']\n offset?: number\n maxWidth?: string\n children?: ReactNode\n}\n\nexport const CustomThemedTooltip: FC<CustomThemedTooltipProps> = ({\n id,\n place = 'bottom',\n className = '',\n openOnClick,\n clickable,\n globalCloseEvents,\n offset,\n maxWidth = '185px',\n children,\n}) => {\n const { theme } = useSelector((state: RootState) => state.darkTheme)\n\n const tooltipStyle =\n theme === 'dark'\n ? {\n backgroundColor: 'rgb(243, 244, 246)',\n color: 'rgb(17, 24, 39)',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: '1.25rem',\n padding: '0.375rem 0.625rem',\n maxWidth,\n borderRadius: '4px',\n }\n : {\n backgroundColor: 'rgb(31, 41, 55)',\n color: 'rgb(249, 250, 251)',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: '1.25rem',\n padding: '0.375rem 0.625rem',\n maxWidth,\n borderRadius: '4px',\n }\n\n return (\n <Tooltip\n id={id}\n place={place}\n className={`pi-z-1000 [&_.react-tooltip-content-wrapper]:pi-p-0 ${className}`}\n opacity={1}\n style={tooltipStyle}\n openOnClick={openOnClick}\n clickable={clickable}\n globalCloseEvents={globalCloseEvents}\n offset={offset}\n >\n {children}\n </Tooltip>\n )\n}\n"],"names":["_a","id","_b","place","_c","className","openOnClick","clickable","globalCloseEvents","offset","_d","maxWidth","children","tooltipStyle","useSelector","state","darkTheme","backgroundColor","color","fontSize","fontWeight","lineHeight","padding","borderRadius","React","Tooltip","concat","opacity","style"],"mappings":"2YAkBiE,SAACA,GAChE,IAAAC,OACAC,EAAAF,EAAAG,MAAAA,aAAQ,SAAQD,EAChBE,EAAAJ,EAAAK,UAAAA,OAAS,IAAAD,EAAG,GAAEA,EACdE,EAAWN,EAAAM,YACXC,cACAC,EAAiBR,EAAAQ,kBACjBC,EAAMT,EAAAS,OACNC,EAAkBV,EAAAW,SAAlBA,OAAW,IAAAD,EAAA,QAAOA,EAClBE,EAAQZ,EAAAY,SAIFC,EACM,SAHMC,cAAY,SAACC,GAAqB,OAAAA,EAAMC,kBAIpD,CACEC,gBAAiB,qBACjBC,MAAO,kBACPC,SAAU,WACVC,WAAY,IACZC,WAAY,UACZC,QAAS,oBACTX,SAAQA,EACRY,aAAc,OAEhB,CACEN,gBAAiB,kBACjBC,MAAO,qBACPC,SAAU,WACVC,WAAY,IACZC,WAAY,UACZC,QAAS,oBACTX,SAAQA,EACRY,aAAc,OAGtB,OACEC,wBAACC,UAAO,CACNxB,GAAIA,EACJE,MAAOA,EACPE,UAAW,uDAAuDqB,OAAArB,GAClEsB,QAAS,EACTC,MAAOf,EACPP,YAAaA,EACbC,UAAWA,EACXC,kBAAmBA,EACnBC,OAAQA,GAEPG,EAGP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../events/CallEvents.js");require("../node_modules/tslib/tslib.es6.js"),require("../store/index.js");var r=require("../events/PlayerEvents.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../events/CallEvents.js");require("../node_modules/tslib/tslib.es6.js"),require("../store/index.js"),require("../services/user.js");var r=require("../events/PlayerEvents.js"),s=require("../events/RecorderEvents.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=l(e);exports.Events=function(e){var l=e.sipHost,u=e.children;return n.default.createElement(n.default.Fragment,null,n.default.createElement(r.PlayerEvents,null),n.default.createElement(s.RecorderEvents,null),n.default.createElement(t.CallEvents,{sipHost:l}),u)};
|
|
2
2
|
//# sourceMappingURL=Events.js.map
|