mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-12 12:25:20 +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 () => {
|
onMount(async () => {
|
||||||
if ($user === undefined || $user === null) {
|
if ($user === undefined || $user === null) {
|
||||||
await goto('/auth');
|
await goto('/auth');
|
||||||
} else if (['user', 'admin'].includes($user?.role)) {
|
return;
|
||||||
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 (!['user', 'admin'].includes($user?.role)) {
|
||||||
|
return;
|
||||||
console.log(DB);
|
|
||||||
} catch (error) {
|
|
||||||
// IndexedDB Not Found
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const chatInputKeys = Object.keys(localStorage).filter((key) => key.startsWith('chat-input'));
|
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) => {
|
const userSettings = await getUserSettings(localStorage.token).catch((error) => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (userSettings) {
|
if (userSettings) {
|
||||||
settings.set(userSettings.ui);
|
return userSettings.ui;
|
||||||
} else {
|
}
|
||||||
let localStorageSettings = {} as Parameters<(typeof settings)['set']>[0];
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
localStorageSettings = JSON.parse(localStorage.getItem('settings') ?? '{}');
|
return JSON.parse(localStorage.getItem('settings') ?? '{}');
|
||||||
} catch (e: unknown) {
|
} catch (e: unknown) {
|
||||||
console.error('Failed to parse settings from localStorage', e);
|
console.error('Failed to parse settings from localStorage', e);
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
settings.set(localStorageSettings);
|
const loadModels = async () => {
|
||||||
}
|
|
||||||
|
|
||||||
models.set(
|
models.set(
|
||||||
await getModels(
|
await getModels(
|
||||||
localStorage.token,
|
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));
|
const loadToolServers = async () => {
|
||||||
tools.set(await getTools(localStorage.token));
|
|
||||||
|
|
||||||
let toolServersData = await getToolServersData($settings?.toolServers ?? []);
|
let toolServersData = await getToolServersData($settings?.toolServers ?? []);
|
||||||
toolServersData = toolServersData.filter((data) => {
|
toolServersData = toolServersData.filter((data) => {
|
||||||
if (data.error) {
|
if (!data || data.error) {
|
||||||
toast.error(
|
toast.error(
|
||||||
$i18n.t(`Failed to connect to {{URL}} OpenAPI tool server`, {
|
$i18n.t(`Failed to connect to {{URL}} OpenAPI tool server`, {
|
||||||
URL: data?.url
|
URL: data?.url
|
||||||
|
|
@ -127,7 +135,31 @@
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
toolServers.set(toolServersData);
|
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) {
|
document.addEventListener('keydown', async function (event) {
|
||||||
const isCtrlPressed = event.ctrlKey || event.metaKey; // metaKey is for Cmd key on Mac
|
const isCtrlPressed = event.ctrlKey || event.metaKey; // metaKey is for Cmd key on Mac
|
||||||
// Check if the Shift key is pressed
|
// Check if the Shift key is pressed
|
||||||
|
|
@ -225,6 +257,8 @@
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
setupKeyboardShortcuts();
|
||||||
|
|
||||||
if ($user?.role === 'admin' && ($settings?.showChangelog ?? true)) {
|
if ($user?.role === 'admin' && ($settings?.showChangelog ?? true)) {
|
||||||
showChangelog.set($settings?.version !== $config.version);
|
showChangelog.set($settings?.version !== $config.version);
|
||||||
|
|
@ -255,7 +289,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await tick();
|
await tick();
|
||||||
}
|
|
||||||
|
|
||||||
loaded = true;
|
loaded = true;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue