Explorar o código

refac: chatlist skip, limit -> page

Timothy J. Baek hai 9 meses
pai
achega
a084938d9c

+ 8 - 2
backend/apps/webui/routers/chats.py

@@ -43,9 +43,15 @@ router = APIRouter()
 @router.get("/", response_model=List[ChatTitleIdResponse])
 @router.get("/list", response_model=List[ChatTitleIdResponse])
 async def get_session_user_chat_list(
-    user=Depends(get_verified_user), skip: int = 0, limit: int = -1
+    user=Depends(get_verified_user), page: Optional[int] = None
 ):
-    return Chats.get_chat_title_id_list_by_user_id(user.id, skip=skip, limit=limit)
+    if page:
+        limit = 20
+        skip = (page - 1) * limit
+
+        return Chats.get_chat_title_id_list_by_user_id(user.id, skip=skip, limit=limit)
+    else:
+        return Chats.get_chat_title_id_list_by_user_id(user.id)
 
 
 ############################

+ 7 - 2
src/lib/apis/chats/index.ts

@@ -32,10 +32,15 @@ export const createNewChat = async (token: string, chat: object) => {
 	return res;
 };
 
-export const getChatList = async (token: string = '', skip: number = 0, limit: number = -1) => {
+export const getChatList = async (token: string = '', page: number | null = null) => {
 	let error = null;
+	const searchParams = new URLSearchParams();
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/chats/?skip=${skip}&limit=${limit}`, {
+	if (page !== null) {
+		searchParams.append('page', `${page}`);
+	}
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/chats/?${searchParams.toString()}`, {
 		method: 'GET',
 		headers: {
 			Accept: 'application/json',

+ 21 - 21
src/lib/components/chat/Chat.svelte

@@ -26,8 +26,7 @@
 		socket,
 		showCallOverlay,
 		tools,
-		pageSkip,
-		pageLimit
+		currentChatPage
 	} from '$lib/stores';
 	import {
 		convertMessagesToHistory,
@@ -423,9 +422,9 @@
 					params: params,
 					files: chatFiles
 				});
-				await chats.set(
-					await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-				);
+
+				currentChatPage.set(0);
+				await chats.set(await getChatList(localStorage.token, $currentChatPage));
 			}
 		}
 	};
@@ -471,9 +470,9 @@
 					params: params,
 					files: chatFiles
 				});
-				await chats.set(
-					await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-				);
+
+				currentChatPage.set(0);
+				await chats.set(await getChatList(localStorage.token, $currentChatPage));
 			}
 		}
 	};
@@ -633,9 +632,9 @@
 					tags: [],
 					timestamp: Date.now()
 				});
-				await chats.set(
-					await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-				);
+
+				currentChatPage.set(0);
+				await chats.set(await getChatList(localStorage.token, $currentChatPage));
 				await chatId.set(chat.id);
 			} else {
 				await chatId.set('local');
@@ -711,7 +710,8 @@
 			})
 		);
 
-		await chats.set(await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit));
+		currentChatPage.set(0);
+		await chats.set(await getChatList(localStorage.token, $currentChatPage));
 
 		return _responses;
 	};
@@ -958,9 +958,9 @@
 						params: params,
 						files: chatFiles
 					});
-					await chats.set(
-						await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-					);
+
+					currentChatPage.set(0);
+					await chats.set(await getChatList(localStorage.token, $currentChatPage));
 				}
 			}
 		} else {
@@ -1227,9 +1227,9 @@
 							params: params,
 							files: chatFiles
 						});
-						await chats.set(
-							await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-						);
+
+						currentChatPage.set(0);
+						await chats.set(await getChatList(localStorage.token, $currentChatPage));
 					}
 				}
 			} else {
@@ -1394,9 +1394,9 @@
 
 		if ($settings.saveChatHistory ?? true) {
 			chat = await updateChatById(localStorage.token, _chatId, { title: _title });
-			await chats.set(
-				await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-			);
+
+			currentChatPage.set(0);
+			await chats.set(await getChatList(localStorage.token, $currentChatPage));
 		}
 	};
 

+ 3 - 2
src/lib/components/chat/Messages.svelte

@@ -1,6 +1,6 @@
 <script lang="ts">
 	import { v4 as uuidv4 } from 'uuid';
-	import { chats, config, settings, user as _user, mobile, pageSkip, pageLimit } from '$lib/stores';
+	import { chats, config, settings, user as _user, mobile, currentChatPage } from '$lib/stores';
 	import { tick, getContext, onMount } from 'svelte';
 
 	import { toast } from 'svelte-sonner';
@@ -90,7 +90,8 @@
 			history: history
 		});
 
-		await chats.set(await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit));
+		currentChatPage.set(0);
+		await chats.set(await getChatList(localStorage.token, $currentChatPage));
 	};
 
 	const confirmEditResponseMessage = async (messageId, content) => {

+ 1 - 1
src/lib/components/chat/Settings/Chats.svelte

@@ -2,7 +2,7 @@
 	import fileSaver from 'file-saver';
 	const { saveAs } = fileSaver;
 
-	import { chats, user, settings, scrollPaginationEnabled, pageSkip, pageLimit } from '$lib/stores';
+	import { chats, user, settings, scrollPaginationEnabled } from '$lib/stores';
 
 	import {
 		archiveAllChats,

+ 3 - 4
src/lib/components/chat/Tags.svelte

@@ -8,7 +8,7 @@
 		getTagsById,
 		updateChatById
 	} from '$lib/apis/chats';
-	import { tags as _tags, chats, pinnedChats, pageSkip, pageLimit } from '$lib/stores';
+	import { tags as _tags, chats, pinnedChats, currentChatPage } from '$lib/stores';
 	import { createEventDispatcher, onMount } from 'svelte';
 
 	const dispatch = createEventDispatcher();
@@ -61,9 +61,8 @@
 		} else {
 			// if the tag we deleted is no longer a valid tag, return to main chat list view
 			enablePagination();
-			await chats.set(
-				await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-			);
+			currentChatPage.set(0);
+			await chats.set(await getChatList(localStorage.token, $currentChatPage));
 			await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
 		}
 	};

+ 14 - 19
src/lib/components/layout/Sidebar.svelte

@@ -12,9 +12,8 @@
 		mobile,
 		showArchivedChats,
 		pinnedChats,
-		pageSkip,
-		pageLimit,
-		scrollPaginationEnabled
+		scrollPaginationEnabled,
+		currentChatPage
 	} from '$lib/stores';
 	import { onMount, getContext, tick } from 'svelte';
 
@@ -60,8 +59,6 @@
 	let chatListLoading = false;
 	let allChatsLoaded = false;
 
-	pageLimit.set(20);
-
 	$: filteredChatList = $chats.filter((chat) => {
 		if (search === '') {
 			return true;
@@ -84,8 +81,9 @@
 
 	const loadMoreChats = async () => {
 		chatListLoading = true;
-		pageSkip.set($pageSkip + 1);
-		const newChatList = await getChatList(localStorage.token, $pageSkip * $pageLimit, $pageLimit);
+
+		currentChatPage.set($currentChatPage + 1);
+		const newChatList = await getChatList(localStorage.token, $currentChatPage);
 
 		// once the bottom of the list has been reached (no results) there is no need to continue querying
 		allChatsLoaded = newChatList.length === 0;
@@ -108,7 +106,7 @@
 		showSidebar.set(window.innerWidth > BREAKPOINT);
 
 		await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
-		await chats.set(await getChatList(localStorage.token, $pageSkip, $pageLimit));
+		await chats.set(await getChatList(localStorage.token, $currentChatPage));
 
 		let touchstart;
 		let touchend;
@@ -209,9 +207,11 @@
 				await tick();
 				goto('/');
 			}
-			await chats.set(
-				await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-			);
+
+			allChatsLoaded = false;
+			currentChatPage.set(0);
+			await chats.set(await getChatList(localStorage.token, $currentChatPage));
+
 			await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
 		}
 	};
@@ -453,9 +453,6 @@
 						on:click={async () => {
 							enablePagination();
 							allChatsLoaded = false;
-							await chats.set(
-								await getChatList(localStorage.token, $pageSkip * $pageLimit, $pageLimit)
-							);
 						}}
 					>
 						{$i18n.t('all')}
@@ -469,11 +466,9 @@
 								if (chatIds.length === 0) {
 									await tags.set(await getAllChatTags(localStorage.token));
 
-									chatIds = await getChatList(
-										localStorage.token,
-										$pageSkip * $pageLimit,
-										$pageLimit
-									);
+									// if the tag we deleted is no longer a valid tag, return to main chat list view
+									enablePagination();
+									allChatsLoaded = false;
 								}
 								await chats.set(chatIds);
 							}}

+ 10 - 16
src/lib/components/layout/Sidebar/ChatItem.svelte

@@ -14,15 +14,7 @@
 		getChatListByTagName,
 		updateChatById
 	} from '$lib/apis/chats';
-	import {
-		chatId,
-		chats,
-		mobile,
-		pageSkip,
-		pageLimit,
-		pinnedChats,
-		showSidebar
-	} from '$lib/stores';
+	import { chatId, chats, mobile, pinnedChats, showSidebar, currentChatPage } from '$lib/stores';
 
 	import ChatMenu from './ChatMenu.svelte';
 	import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
@@ -48,9 +40,9 @@
 			await updateChatById(localStorage.token, id, {
 				title: _title
 			});
-			await chats.set(
-				await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-			);
+
+			currentChatPage.set(0);
+			await chats.set(await getChatList(localStorage.token, $currentChatPage));
 			await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
 		}
 	};
@@ -63,16 +55,18 @@
 
 		if (res) {
 			goto(`/c/${res.id}`);
-			await chats.set(
-				await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit)
-			);
+
+			currentChatPage.set(0);
+			await chats.set(await getChatList(localStorage.token, $currentChatPage));
 			await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
 		}
 	};
 
 	const archiveChatHandler = async (id) => {
 		await archiveChatById(localStorage.token, id);
-		await chats.set(await getChatList(localStorage.token, 0, $pageSkip * $pageLimit || $pageLimit));
+
+		currentChatPage.set(0);
+		await chats.set(await getChatList(localStorage.token, $currentChatPage));
 		await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
 	};
 

+ 1 - 2
src/lib/stores/index.ts

@@ -43,8 +43,7 @@ export const showChangelog = writable(false);
 export const showCallOverlay = writable(false);
 
 export const scrollPaginationEnabled = writable(true);
-export const pageSkip = writable(0);
-export const pageLimit = writable(-1);
+export const currentChatPage = writable(0);
 
 export type Model = OpenAIModel | OllamaModel;
 

+ 4 - 5
src/lib/utils/index.ts

@@ -1,7 +1,7 @@
 import { v4 as uuidv4 } from 'uuid';
 import sha256 from 'js-sha256';
 import { WEBUI_BASE_URL } from '$lib/constants';
-import { scrollPaginationEnabled, pageLimit, pageSkip, chats } from '$lib/stores';
+import { scrollPaginationEnabled, chats, currentChatPage } from '$lib/stores';
 
 //////////////////////////
 // Helper functions
@@ -782,14 +782,13 @@ export const bestMatchingLanguage = (supportedLanguages, preferredLanguages, def
 };
 
 export const enablePagination = () => {
+	// Enable infinite scroll pagination
 	chats.set([]);
+	currentChatPage.set(0);
 	scrollPaginationEnabled.set(true);
-	pageLimit.set(20);
-	pageSkip.set(0);
 };
 
 export const disablePagination = () => {
+	// Disable infinite scroll pagination
 	scrollPaginationEnabled.set(false);
-	pageLimit.set(-1);
-	pageSkip.set(0);
 };