Timothy J. Baek 1 год назад
Родитель
Сommit
0fdb346a31

+ 35 - 26
src/lib/components/chat/SettingsModal.svelte

@@ -22,6 +22,7 @@
 	// General
 	// General
 	let API_BASE_URL = OLLAMA_API_BASE_URL;
 	let API_BASE_URL = OLLAMA_API_BASE_URL;
 	let theme = 'dark';
 	let theme = 'dark';
+	let notificationEnabled = false;
 	let system = '';
 	let system = '';
 
 
 	// Advanced
 	// Advanced
@@ -49,7 +50,6 @@
 	let pullProgress = null;
 	let pullProgress = null;
 
 
 	// Addons
 	// Addons
-	let responseNotification = false;
 	let titleAutoGenerate = true;
 	let titleAutoGenerate = true;
 	let speechAutoSend = false;
 	let speechAutoSend = false;
 
 
@@ -110,12 +110,12 @@
 		saveSettings({ titleAutoGenerate: titleAutoGenerate });
 		saveSettings({ titleAutoGenerate: titleAutoGenerate });
 	};
 	};
 
 
-	const toggleResponseNotification = async () => {
+	const toggleNotification = async () => {
 		const permission = await Notification.requestPermission();
 		const permission = await Notification.requestPermission();
 
 
 		if (permission === 'granted') {
 		if (permission === 'granted') {
-			responseNotification = !responseNotification;
-			saveSettings({ responseNotification: responseNotification });
+			notificationEnabled = !notificationEnabled;
+			saveSettings({ notificationEnabled: notificationEnabled });
 		} else {
 		} else {
 			toast.error(
 			toast.error(
 				'Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.'
 				'Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.'
@@ -168,6 +168,13 @@
 						if (data.status) {
 						if (data.status) {
 							if (!data.digest) {
 							if (!data.digest) {
 								toast.success(data.status);
 								toast.success(data.status);
+
+								if (data.status === 'success') {
+									const notification = new Notification(`Ollama`, {
+										body: `Model '${modelTag}' has been successfully downloaded.`,
+										icon: '/favicon.png'
+									});
+								}
 							} else {
 							} else {
 								digest = data.digest;
 								digest = data.digest;
 								if (data.completed) {
 								if (data.completed) {
@@ -524,8 +531,10 @@
 				{#if selectedTab === 'general'}
 				{#if selectedTab === 'general'}
 					<div class="flex flex-col space-y-3">
 					<div class="flex flex-col space-y-3">
 						<div>
 						<div>
-							<div class=" py-1 flex w-full justify-between">
-								<div class=" self-center text-sm font-medium">Theme</div>
+							<div class=" mb-1 text-sm font-medium">WebUI Settings</div>
+
+							<div class=" py-0.5 flex w-full justify-between">
+								<div class=" self-center text-xs font-medium">Theme</div>
 
 
 								<button
 								<button
 									class="p-1 px-3 text-xs flex rounded transition"
 									class="p-1 px-3 text-xs flex rounded transition"
@@ -563,6 +572,26 @@
 									{/if}
 									{/if}
 								</button>
 								</button>
 							</div>
 							</div>
+
+							<div>
+								<div class=" py-0.5 flex w-full justify-between">
+									<div class=" self-center text-xs font-medium">Notification</div>
+
+									<button
+										class="p-1 px-3 text-xs flex rounded transition"
+										on:click={() => {
+											toggleNotification();
+										}}
+										type="button"
+									>
+										{#if notificationEnabled === true}
+											<span class="ml-2 self-center">On</span>
+										{:else}
+											<span class="ml-2 self-center">Off</span>
+										{/if}
+									</button>
+								</div>
+							</div>
 						</div>
 						</div>
 
 
 						<hr class=" dark:border-gray-700" />
 						<hr class=" dark:border-gray-700" />
@@ -819,26 +848,6 @@
 							<div>
 							<div>
 								<div class=" mb-1 text-sm font-medium">WebUI Add-ons</div>
 								<div class=" mb-1 text-sm font-medium">WebUI Add-ons</div>
 
 
-								<div>
-									<div class=" py-0.5 flex w-full justify-between">
-										<div class=" self-center text-xs font-medium">Response Notification</div>
-
-										<button
-											class="p-1 px-3 text-xs flex rounded transition"
-											on:click={() => {
-												toggleResponseNotification();
-											}}
-											type="button"
-										>
-											{#if responseNotification === true}
-												<span class="ml-2 self-center">On</span>
-											{:else}
-												<span class="ml-2 self-center">Off</span>
-											{/if}
-										</button>
-									</div>
-								</div>
-
 								<div>
 								<div>
 									<div class=" py-0.5 flex w-full justify-between">
 									<div class=" py-0.5 flex w-full justify-between">
 										<div class=" self-center text-xs font-medium">Title Auto Generation</div>
 										<div class=" self-center text-xs font-medium">Title Auto Generation</div>

+ 1 - 1
src/routes/(app)/+page.svelte

@@ -222,7 +222,7 @@
 								};
 								};
 								messages = messages;
 								messages = messages;
 
 
-								if ($settings.responseNotification && !document.hasFocus()) {
+								if ($settings.notificationEnabled && !document.hasFocus()) {
 									const notification = new Notification(
 									const notification = new Notification(
 										selectedModelfile
 										selectedModelfile
 											? `${
 											? `${

+ 1 - 1
src/routes/(app)/c/[id]/+page.svelte

@@ -236,7 +236,7 @@
 								};
 								};
 								messages = messages;
 								messages = messages;
 
 
-								if ($settings.responseNotification && !document.hasFocus()) {
+								if ($settings.notificationEnabled && !document.hasFocus()) {
 									const notification = new Notification(
 									const notification = new Notification(
 										selectedModelfile
 										selectedModelfile
 											? `${
 											? `${