diff --git a/dailyjs/basic-call/public/message.mp3 b/dailyjs/basic-call/public/message.mp3 new file mode 100644 index 0000000..a067315 Binary files /dev/null and b/dailyjs/basic-call/public/message.mp3 differ diff --git a/dailyjs/basic-call/public/public b/dailyjs/basic-call/public/public deleted file mode 120000 index 33a6e67..0000000 --- a/dailyjs/basic-call/public/public +++ /dev/null @@ -1 +0,0 @@ -../basic-call/public \ No newline at end of file diff --git a/dailyjs/text-chat/README.md b/dailyjs/text-chat/README.md index e609864..42f4161 100644 --- a/dailyjs/text-chat/README.md +++ b/dailyjs/text-chat/README.md @@ -7,6 +7,7 @@ - Use [sendAppMessage](https://docs.daily.co/reference#%EF%B8%8F-sendappmessage) to send messages - Listen for incoming messages using the call object `app-message` event - Extend the basic call demo with a chat provider and aside +- Show a notification bubble on chat tray button when a new message is received - Demonstrate how to play a sound whenever a message is received Please note: this demo is not currently mobile optimised diff --git a/dailyjs/text-chat/components/ChatAside/ChatAside.js b/dailyjs/text-chat/components/ChatAside/ChatAside.js index 347de26..2c88d3e 100644 --- a/dailyjs/text-chat/components/ChatAside/ChatAside.js +++ b/dailyjs/text-chat/components/ChatAside/ChatAside.js @@ -4,22 +4,32 @@ import { Button } from '@dailyjs/shared/components/Button'; import { TextInput } from '@dailyjs/shared/components/Input'; import { useUIState } from '@dailyjs/shared/contexts/UIStateProvider'; import { useChat } from '../../contexts/ChatProvider'; +import { useMessageSound } from '../../hooks/useMessageSound'; export const CHAT_ASIDE = 'chat'; export const ChatAside = () => { const { showAside, setShowAside } = useUIState(); - const { sendMessage, chatHistory, setHasNewMessages } = useChat(); + const { sendMessage, chatHistory, hasNewMessages, setHasNewMessages } = + useChat(); const [newMessage, setNewMessage] = useState(''); + const playMessageSound = useMessageSound(); + const chatWindowRef = useRef(); useEffect(() => { - // Clear out any new message otifications if we're showing the chat screen + // Clear out any new message notifications if we're showing the chat screen if (showAside === CHAT_ASIDE) { setHasNewMessages(false); } }, [showAside, chatHistory.length, setHasNewMessages]); + useEffect(() => { + if (hasNewMessages && showAside !== CHAT_ASIDE) { + playMessageSound(); + } + }, [playMessageSound, showAside, hasNewMessages]); + useEffect(() => { if (chatWindowRef.current) { chatWindowRef.current.scrollTop = chatWindowRef.current.scrollHeight; diff --git a/dailyjs/text-chat/contexts/ChatProvider.js b/dailyjs/text-chat/contexts/ChatProvider.js index 86d469d..6ad611a 100644 --- a/dailyjs/text-chat/contexts/ChatProvider.js +++ b/dailyjs/text-chat/contexts/ChatProvider.js @@ -29,8 +29,6 @@ export const ChatProvider = ({ children }) => { ]); setHasNewMessages(true); - - // Play notification here... }, [callObject] ); diff --git a/dailyjs/text-chat/hooks/useMessageSound.js b/dailyjs/text-chat/hooks/useMessageSound.js new file mode 100644 index 0000000..e894a1c --- /dev/null +++ b/dailyjs/text-chat/hooks/useMessageSound.js @@ -0,0 +1,19 @@ +import { useEffect, useMemo } from 'react'; + +import { useSound } from '@dailyjs/shared/hooks/useSound'; +import { debounce } from 'debounce'; + +/** + * Convenience hook to play `join.mp3` when participants join the call + */ +export const useMessageSound = () => { + const { load, play } = useSound('message.mp3'); + + useEffect(() => { + load(); + }, [load]); + + return useMemo(() => debounce(() => play(), 5000, true), [play]); +}; + +export default useMessageSound;