import { getFileNameWithoutExt, type RINGS_TYPE, type RingtoneItem, } from '@ringcentral-integration/commons/modules/RingtoneConfiguration'; import { RcIcon, RcMenuItem, RcSelect, RcText, RcTooltip, RcTypography, useAudio, } from '@ringcentral/juno'; import { PlayCircleBorder, Delete } from '@ringcentral/juno-icon'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { RemoveRingtoneDialog } from './components/RemoveRingtoneDialog'; import { RingtoneUploadButton } from './components/RingtoneUploadButton'; import { t } from './i18n'; import styles from './styles.scss'; export interface RingtoneSelectionProps { ringtoneList: RingtoneItem[]; selectedRingtoneId: string; ringtoneDeviceId?: string; enableCustomRingtone?: boolean; volume?: number; label?: string; isDisabled?: boolean; isUploadRingtoneDisabled?: boolean; updateCurrentRingtone: (id: string) => void; removeCustomRingtone: (id: string) => void; uploadCustomRingtone: (props: any) => void; showAlert: (message: string) => void; } export const RingtoneSelection = ({ label, volume, isDisabled, ringtoneList, ringtoneDeviceId, selectedRingtoneId, enableCustomRingtone, isUploadRingtoneDisabled, updateCurrentRingtone, uploadCustomRingtone, removeCustomRingtone, showAlert, }: RingtoneSelectionProps) => { const [playing, setPlaying] = useState(false); const [playingId, setPlayingId] = useState(''); const [open, setOpen] = useState(false); const [audioUrl, setAudioUrl] = useState(''); const [ringtonePlanToRemoved, setRingtonePlanToRemoved] = useState<{ id: string; name: string; }>({ id: '', name: '', }); const audio = useAudio((audio) => { const resetPlaying = () => { setPlaying(false); setPlayingId(''); }; audio.onplay = () => setPlaying(true); audio.onpause = resetPlaying; audio.onended = resetPlaying; audio.onerror = resetPlaying; if (volume !== undefined) { audio.volume = volume; } if (audioUrl) { audio.src = audioUrl; } if (ringtoneDeviceId) { audio.setSinkId?.(ringtoneDeviceId); } }); const turnOffAudio = useCallback(() => { if (playing) { audio.pause(); audio.currentTime = 0; } }, [audio, playing]); const customRingtoneNameList = useMemo(() => { const customRingtoneList = ringtoneList.filter( (ringtone) => ringtone.type === 'custom', ); return customRingtoneList.map((ringtone) => ringtone.name!); }, [ringtoneList]); useEffect(() => { if (volume !== undefined) { audio.volume = volume; } if (ringtoneDeviceId) { audio.setSinkId?.(ringtoneDeviceId); } }, [audio, volume, ringtoneDeviceId]); return (
{enableCustomRingtone && ( setRingtonePlanToRemoved({ id: '', name: '' })} onConfirm={() => { setRingtonePlanToRemoved({ id: '', name: '' }); removeCustomRingtone(ringtonePlanToRemoved.id); }} /> )} {label ? ( {label} ) : null} setOpen(true)} onClose={() => { turnOffAudio(); setOpen(false); }} > {enableCustomRingtone && ( { showAlert(message); setOpen(false); }} onUploadRingtone={(info) => { uploadCustomRingtone(info); setOpen(false); }} onClickAddButton={turnOffAudio} /> )} {ringtoneList.map((ringtone) => { const { id, type, name, url } = ringtone; const isDefaultRingtone = type === 'default'; return ( { e.stopPropagation(); if (selectedRingtoneId !== id) { updateCurrentRingtone(id); } setOpen(false); }} > {isDefaultRingtone ? t(id as RINGS_TYPE) : getFileNameWithoutExt(name!)} {url && (
{!isDefaultRingtone && ( { e.stopPropagation(); turnOffAudio(); setOpen(false); setRingtonePlanToRemoved({ id, name: name! }); }} /> )} { e.stopPropagation(); try { turnOffAudio(); if (ringtoneDeviceId === 'off' || !ringtoneDeviceId) { return; } setPlayingId(id); audio.src = url; setAudioUrl(url); audio.play(); } catch (err) { console.log(err); } }} />
)}
); })}
); };