From 62cfba2d5dcc8fc5621f49523df7fa55cf32334e Mon Sep 17 00:00:00 2001 From: gofnnp Date: Tue, 5 Aug 2025 11:42:33 +0400 Subject: [PATCH] notification-sound fix sound on ios --- global.d.ts | 7 +++ public/audio/notification-new-message-1.wav | Bin 0 -> 377934 bytes src/app/[locale]/layout.tsx | 17 +++--- src/hooks/audio/useAudio.ts | 57 +++++++++++-------- src/hooks/chats/useChatsSocket.ts | 10 +--- src/providers/audio-provider.tsx | 29 ++++++++++ src/services/audio/index.ts | 58 -------------------- src/shared/constants/audio/index.ts | 9 --- 8 files changed, 83 insertions(+), 104 deletions(-) create mode 100644 global.d.ts create mode 100644 public/audio/notification-new-message-1.wav create mode 100644 src/providers/audio-provider.tsx delete mode 100644 src/services/audio/index.ts delete mode 100644 src/shared/constants/audio/index.ts diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..98af3d3 --- /dev/null +++ b/global.d.ts @@ -0,0 +1,7 @@ +declare global { + interface Window { + webkitAudioContext: typeof AudioContext; + } +} + +export {}; diff --git a/public/audio/notification-new-message-1.wav b/public/audio/notification-new-message-1.wav new file mode 100644 index 0000000000000000000000000000000000000000..c7017adc0ed1f1218f2a6449aa876557daf5a73e GIT binary patch literal 377934 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 - - - - {children} - - - + + + + + {children} + + + + diff --git a/src/hooks/audio/useAudio.ts b/src/hooks/audio/useAudio.ts index d6b7bce..03143d1 100644 --- a/src/hooks/audio/useAudio.ts +++ b/src/hooks/audio/useAudio.ts @@ -2,35 +2,48 @@ import { useCallback, useEffect, useMemo } from "react"; -import { audioService } from "@/services/audio"; -import { AudioUrls } from "@/shared/constants/audio"; - -interface UseAudioOptions { - enabled?: boolean; - preload?: AudioUrls[]; -} - -export const useAudio = (options: UseAudioOptions = {}) => { - const { enabled = true, preload = [] } = options; - - useEffect(() => { - audioService.setEnabled(enabled); - }, [enabled]); - - useEffect(() => { - if (preload.length > 0) { - audioService.preload(preload); +export const useAudio = () => { + const audio = useMemo(() => { + if (typeof window !== "undefined") { + const audioElement = new Audio("/audio/notification-new-message-1.wav"); + audioElement.preload = "auto"; + return audioElement; } - }, [preload]); + return null; + }, []); + + const _audioContext = useMemo(() => { + if (typeof window !== "undefined") { + return new (window.AudioContext || window.webkitAudioContext)(); + } + return null; + }, []); + + useEffect(() => { + if (!audio) return; + + const handleClick = () => { + audio.currentTime = 0; + audio.play(); + setTimeout(() => { + audio.pause(); + }, 10); + }; + document.addEventListener("click", handleClick, { once: true }); + return () => { + document.removeEventListener("click", handleClick); + }; + }, [audio]); const playNewMessageNotification = useCallback(() => { - audioService.play(AudioUrls.NewMessage); - }, []); + if (!audio) return; + audio.currentTime = 0; + audio.play(); + }, [audio]); return useMemo( () => ({ playNewMessageNotification, - isEnabled: audioService.isAudioEnabled(), }), [playNewMessageNotification] ); diff --git a/src/hooks/chats/useChatsSocket.ts b/src/hooks/chats/useChatsSocket.ts index 08ed718..fac3659 100644 --- a/src/hooks/chats/useChatsSocket.ts +++ b/src/hooks/chats/useChatsSocket.ts @@ -3,9 +3,8 @@ import { useMemo, useState } from "react"; import { IGetChatsListResponse } from "@/entities/chats/types"; -import { AudioUrls } from "@/shared/constants/audio"; +import { useAudioContext } from "@/providers/audio-provider"; -import { useAudio } from "../audio/useAudio"; import { useSocketEvent } from "../socket/useSocketEvent"; export interface UseChatsSocketOptions { @@ -14,8 +13,6 @@ export interface UseChatsSocketOptions { } export const useChatsSocket = (options: UseChatsSocketOptions = {}) => { - const { enableNotificationSound = true } = options; - const initialChats = options.initialChats ?? { categorizedChats: {}, startedChats: [], @@ -23,10 +20,7 @@ export const useChatsSocket = (options: UseChatsSocketOptions = {}) => { totalUnreadCount: 0, }; - const { playNewMessageNotification } = useAudio({ - enabled: enableNotificationSound, - preload: [AudioUrls.NewMessage], - }); + const { playNewMessageNotification } = useAudioContext(); const [isInChat, setIsInChat] = useState(false); const [chats, setChats] = useState(initialChats); diff --git a/src/providers/audio-provider.tsx b/src/providers/audio-provider.tsx new file mode 100644 index 0000000..afeb44f --- /dev/null +++ b/src/providers/audio-provider.tsx @@ -0,0 +1,29 @@ +"use client"; + +import { createContext, ReactNode, useContext } from "react"; + +import { useAudio } from "@/hooks/audio/useAudio"; + +type AudioContextValue = ReturnType; + +const AudioContext = createContext(null); + +export function useAudioContext() { + const ctx = useContext(AudioContext); + if (!ctx) { + throw new Error("useAudio must be used within "); + } + return ctx; +} + +interface AudioProviderProps { + children: ReactNode; +} + +export function AudioProvider({ children }: AudioProviderProps) { + const value = useAudio(); + + return ( + {children} + ); +} diff --git a/src/services/audio/index.ts b/src/services/audio/index.ts deleted file mode 100644 index 515f9d5..0000000 --- a/src/services/audio/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -"use client"; - -import { AudioUrls, getAudioUrl } from "@/shared/constants/audio"; - -class AudioService { - private audioElements = new Map(); - private isEnabled = true; - - private getAudioElement(url: string): HTMLAudioElement | undefined { - if (!this.audioElements.has(url)) { - const audio = new Audio(url); - audio.preload = "auto"; - this.audioElements.set(url, audio); - } - return this.audioElements.get(url); - } - - play(key: AudioUrls): Promise { - if (!this.isEnabled) return Promise.resolve(); - - try { - const audio = this.getAudioElement(getAudioUrl(key)); - if (audio) { - audio.currentTime = 0; - return audio.play(); - } - return Promise.resolve(); - } catch (error) { - // eslint-disable-next-line no-console - console.warn("Failed to play audio:", error); - return Promise.resolve(); - } - } - - setEnabled(enabled: boolean): void { - this.isEnabled = enabled; - } - - isAudioEnabled(): boolean { - return this.isEnabled; - } - - preload(keys: AudioUrls[]): void { - keys.forEach(key => { - this.getAudioElement(getAudioUrl(key)); - }); - } - - dispose(): void { - this.audioElements.forEach(audio => { - audio.pause(); - audio.src = ""; - }); - this.audioElements.clear(); - } -} - -export const audioService = new AudioService(); diff --git a/src/shared/constants/audio/index.ts b/src/shared/constants/audio/index.ts deleted file mode 100644 index 308581f..0000000 --- a/src/shared/constants/audio/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -const audioUrls: Record = { - "new-message": "/audio/notification-new-message-1.mp3", -}; - -export enum AudioUrls { - NewMessage = "new-message", -} - -export const getAudioUrl = (key: AudioUrls) => audioUrls[key];