enh: notificationSoundAlways option
Some checks are pending
Deploy to HuggingFace Spaces / check-secret (push) Waiting to run
Deploy to HuggingFace Spaces / deploy (push) Blocked by required conditions
Create and publish Docker images with specific build args / build-main-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-main-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / merge-main-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-cuda-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-ollama-images (push) Blocked by required conditions
Frontend Build / Format & Build Frontend (push) Waiting to run
Frontend Build / Frontend Unit Tests (push) Waiting to run

This commit is contained in:
Timothy Jaeryang Baek 2025-04-19 23:13:19 -07:00
parent 8fcad1df4e
commit f4de3b4c45
3 changed files with 46 additions and 3 deletions

View File

@ -73,4 +73,4 @@
### Contributor License Agreement
By submitting this pull request, I confirm that I have read and fully agree to the [CONTRIBUTOR_LICENSE_AGREEMENT](CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms.
By submitting this pull request, I confirm that I have read and fully agree to the [Contributor License Agreement (CLA)](/CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms.

View File

@ -30,7 +30,9 @@
// Interface
let defaultModelId = '';
let showUsername = false;
let notificationSound = true;
let notificationSoundAlways = false;
let detectArtifacts = true;
@ -117,6 +119,11 @@
saveSettings({ notificationSound: notificationSound });
};
const toggleNotificationSoundAlways = async () => {
notificationSoundAlways = !notificationSoundAlways;
saveSettings({ notificationSoundAlways: notificationSoundAlways });
};
const toggleShowChangelog = async () => {
showChangelog = !showChangelog;
saveSettings({ showChangelog: showChangelog });
@ -294,7 +301,8 @@
chatDirection = $settings.chatDirection ?? 'auto';
userLocation = $settings.userLocation ?? false;
notificationSound = $settings.notificationSound ?? true;
notificationSound = $settings?.notificationSound ?? true;
notificationSoundAlways = $settings?.notificationSoundAlways ?? false;
hapticFeedback = $settings.hapticFeedback ?? false;
ctrlEnterToSend = $settings.ctrlEnterToSend ?? false;
@ -477,6 +485,30 @@
</div>
</div>
{#if notificationSound}
<div>
<div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs">
{$i18n.t('Always Play Notification Sound')}
</div>
<button
class="p-1 px-3 text-xs flex rounded-sm transition"
on:click={() => {
toggleNotificationSoundAlways();
}}
type="button"
>
{#if notificationSoundAlways === true}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
{/if}
</button>
</div>
</div>
{/if}
{#if $user?.role === 'admin'}
<div>
<div class=" py-0.5 flex w-full justify-between">

View File

@ -26,7 +26,8 @@
isLastActiveTab,
isApp,
appInfo,
toolServers
toolServers,
playingNotificationSound
} from '$lib/stores';
import { goto } from '$app/navigation';
import { page } from '$app/stores';
@ -259,6 +260,16 @@
const { done, content, title } = data;
if (done) {
if ($settings?.notificationSoundAlways ?? false) {
playingNotificationSound.set(true);
const audio = new Audio(`/audio/notification.mp3`);
audio.play().finally(() => {
// Ensure the global state is reset after the sound finishes
playingNotificationSound.set(false);
});
}
if ($isLastActiveTab) {
if ($settings?.notificationEnabled ?? false) {
new Notification(`${title} | Open WebUI`, {