Sfoglia il codice sorgente

Merge pull request #17559 from ShirasawaSama/patch-14

feat: load data in parallel to accelerate page loading speed
Tim Jaeryang Baek 5 giorni fa
parent
commit
d9fdbb627f
1 ha cambiato i file con 86 aggiunte e 53 eliminazioni
  1. 86 53
      src/routes/(app)/+layout.svelte

+ 86 - 53
src/routes/(app)/+layout.svelte

@@ -59,64 +59,72 @@
 	onMount(async () => {
 		if ($user === undefined || $user === null) {
 			await goto('/auth');
-		} else if (['user', 'admin'].includes($user?.role)) {
+			return;
+		}
+		if (!['user', 'admin'].includes($user?.role)) {
+			return;
+		}
+
+		const chatInputKeys = Object.keys(localStorage).filter((key) => key.startsWith('chat-input'));
+		if (chatInputKeys.length > 0) {
+			chatInputKeys.forEach((key) => {
+				localStorage.removeItem(key);
+			});
+		}
+
+		const loadChatsFromDB = async () => {
 			try {
 				// Check if IndexedDB exists
 				DB = await openDB('Chats', 1);
 
-				if (DB) {
-					const chats = await DB.getAllFromIndex('chats', 'timestamp');
-					localDBChats = chats.map((item, idx) => chats[chats.length - 1 - idx]);
-
-					if (localDBChats.length === 0) {
-						await deleteDB('Chats');
-					}
+				if (!DB) {
+					return;
 				}
 
-				console.log(DB);
+				const chats = await DB.getAllFromIndex('chats', 'timestamp');
+				localDBChats = chats.map((item, idx) => chats[chats.length - 1 - idx]);
+
+				if (localDBChats.length === 0) {
+					await deleteDB('Chats');
+				}
 			} catch (error) {
 				// IndexedDB Not Found
 			}
+		};
 
-			const chatInputKeys = Object.keys(localStorage).filter((key) => key.startsWith('chat-input'));
-			if (chatInputKeys.length > 0) {
-				chatInputKeys.forEach((key) => {
-					localStorage.removeItem(key);
-				});
-			}
-
+		const loadUserSettings = async (): Promise<Parameters<(typeof settings)['set']>[0]> => {
 			const userSettings = await getUserSettings(localStorage.token).catch((error) => {
 				console.error(error);
 				return null;
 			});
 
 			if (userSettings) {
-				settings.set(userSettings.ui);
-			} else {
-				let localStorageSettings = {} as Parameters<(typeof settings)['set']>[0];
-
-				try {
-					localStorageSettings = JSON.parse(localStorage.getItem('settings') ?? '{}');
-				} catch (e: unknown) {
-					console.error('Failed to parse settings from localStorage', e);
-				}
+				return userSettings.ui;
+			}
 
-				settings.set(localStorageSettings);
+			try {
+				return JSON.parse(localStorage.getItem('settings') ?? '{}');
+			} catch (e: unknown) {
+				console.error('Failed to parse settings from localStorage', e);
+				return {};
 			}
+		};
 
+		const loadModels = async () => {
 			models.set(
 				await getModels(
 					localStorage.token,
-					$config?.features?.enable_direct_connections && ($settings?.directConnections ?? null)
+					$config?.features?.enable_direct_connections
+						? ($settings?.directConnections ?? null)
+						: null
 				)
 			);
+		};
 
-			banners.set(await getBanners(localStorage.token));
-			tools.set(await getTools(localStorage.token));
-
+		const loadToolServers = async () => {
 			let toolServersData = await getToolServersData($settings?.toolServers ?? []);
 			toolServersData = toolServersData.filter((data) => {
-				if (data.error) {
+				if (!data || data.error) {
 					toast.error(
 						$i18n.t(`Failed to connect to {{URL}} OpenAPI tool server`, {
 							URL: data?.url
@@ -127,7 +135,31 @@
 				return true;
 			});
 			toolServers.set(toolServersData);
-
+		};
+
+		const loadBanners = async () => {
+			const bannersData = await getBanners(localStorage.token);
+			banners.set(bannersData);
+		};
+
+		const loadTools = async () => {
+			const toolsData = await getTools(localStorage.token);
+			tools.set(toolsData);
+		};
+
+		// Parallel loading
+		await Promise.all([
+			loadChatsFromDB(),
+			loadBanners(),
+			loadTools(),
+			loadUserSettings().then((loadedSettings) => {
+				settings.set(loadedSettings);
+				// The following functions are dependent on the settings
+				return Promise.all([loadModels(), loadToolServers()]);
+			})
+		]);
+
+		const setupKeyboardShortcuts = () => {
 			document.addEventListener('keydown', async function (event) {
 				const isCtrlPressed = event.ctrlKey || event.metaKey; // metaKey is for Cmd key on Mac
 				// Check if the Shift key is pressed
@@ -225,37 +257,38 @@
 					}, 0);
 				}
 			});
+		};
+		setupKeyboardShortcuts();
 
-			if ($user?.role === 'admin' && ($settings?.showChangelog ?? true)) {
-				showChangelog.set($settings?.version !== $config.version);
-			}
+		if ($user?.role === 'admin' && ($settings?.showChangelog ?? true)) {
+			showChangelog.set($settings?.version !== $config.version);
+		}
 
-			if ($user?.role === 'admin' || ($user?.permissions?.chat?.temporary ?? true)) {
-				if ($page.url.searchParams.get('temporary-chat') === 'true') {
-					temporaryChatEnabled.set(true);
-				}
+		if ($user?.role === 'admin' || ($user?.permissions?.chat?.temporary ?? true)) {
+			if ($page.url.searchParams.get('temporary-chat') === 'true') {
+				temporaryChatEnabled.set(true);
+			}
 
-				if ($user?.role !== 'admin' && $user?.permissions?.chat?.temporary_enforced) {
-					temporaryChatEnabled.set(true);
-				}
+			if ($user?.role !== 'admin' && $user?.permissions?.chat?.temporary_enforced) {
+				temporaryChatEnabled.set(true);
 			}
+		}
 
-			// Check for version updates
-			if ($user?.role === 'admin' && $config?.features?.enable_version_update_check) {
-				// Check if the user has dismissed the update toast in the last 24 hours
-				if (localStorage.dismissedUpdateToast) {
-					const dismissedUpdateToast = new Date(Number(localStorage.dismissedUpdateToast));
-					const now = new Date();
+		// Check for version updates
+		if ($user?.role === 'admin' && $config?.features?.enable_version_update_check) {
+			// Check if the user has dismissed the update toast in the last 24 hours
+			if (localStorage.dismissedUpdateToast) {
+				const dismissedUpdateToast = new Date(Number(localStorage.dismissedUpdateToast));
+				const now = new Date();
 
-					if (now - dismissedUpdateToast > 24 * 60 * 60 * 1000) {
-						checkForVersionUpdates();
-					}
-				} else {
+				if (now - dismissedUpdateToast > 24 * 60 * 60 * 1000) {
 					checkForVersionUpdates();
 				}
+			} else {
+				checkForVersionUpdates();
 			}
-			await tick();
 		}
+		await tick();
 
 		loaded = true;
 	});