mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-12 04:15:25 +00:00
feat: load data in parallel to accelerate page loading speed
This commit is contained in:
parent
c8c6a48b94
commit
981306fa2b
1 changed files with 86 additions and 53 deletions
|
|
@ -59,23 +59,10 @@
|
|||
onMount(async () => {
|
||||
if ($user === undefined || $user === null) {
|
||||
await goto('/auth');
|
||||
} else if (['user', 'admin'].includes($user?.role)) {
|
||||
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');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
console.log(DB);
|
||||
} catch (error) {
|
||||
// IndexedDB Not Found
|
||||
if (!['user', 'admin'].includes($user?.role)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const chatInputKeys = Object.keys(localStorage).filter((key) => key.startsWith('chat-input'));
|
||||
|
|
@ -85,38 +72,59 @@
|
|||
});
|
||||
}
|
||||
|
||||
const loadChatsFromDB = async () => {
|
||||
try {
|
||||
// Check if IndexedDB exists
|
||||
DB = await openDB('Chats', 1);
|
||||
|
||||
if (!DB) {
|
||||
return;
|
||||
}
|
||||
|
||||
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 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];
|
||||
return userSettings.ui;
|
||||
}
|
||||
|
||||
try {
|
||||
localStorageSettings = JSON.parse(localStorage.getItem('settings') ?? '{}');
|
||||
return JSON.parse(localStorage.getItem('settings') ?? '{}');
|
||||
} catch (e: unknown) {
|
||||
console.error('Failed to parse settings from localStorage', e);
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
settings.set(localStorageSettings);
|
||||
}
|
||||
|
||||
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,6 +257,8 @@
|
|||
}, 0);
|
||||
}
|
||||
});
|
||||
};
|
||||
setupKeyboardShortcuts();
|
||||
|
||||
if ($user?.role === 'admin' && ($settings?.showChangelog ?? true)) {
|
||||
showChangelog.set($settings?.version !== $config.version);
|
||||
|
|
@ -255,7 +289,6 @@
|
|||
}
|
||||
}
|
||||
await tick();
|
||||
}
|
||||
|
||||
loaded = true;
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue