refactor: improve session limit and offset validation in provider routes

This commit is contained in:
Haileyesus
2026-04-29 11:46:53 +03:00
parent 10f35c238d
commit 0f93ef2781
4 changed files with 105 additions and 48 deletions

View File

@@ -120,6 +120,8 @@ export function useSidebarController({
const searchSeqRef = useRef(0);
const eventSourceRef = useRef<EventSource | null>(null);
const starToggleSequenceByProjectRef = useRef<Map<string, number>>(new Map());
const migrationStartedRef = useRef(false);
const onRefreshRef = useRef(onRefresh);
const isSidebarCollapsed = !isMobile && !sidebarVisible;
@@ -194,19 +196,25 @@ export function useSidebarController({
}, []);
useEffect(() => {
onRefreshRef.current = onRefresh;
}, [onRefresh]);
useEffect(() => {
if (migrationStartedRef.current) {
return;
}
const legacyStarredProjectIds = readLegacyStarredProjectIds();
if (legacyStarredProjectIds.length === 0) {
return;
}
let active = true;
migrationStartedRef.current = true;
const migrateLegacyStars = async () => {
try {
await api.migrateLegacyProjectStars(legacyStarredProjectIds);
if (active) {
await onRefresh();
}
await onRefreshRef.current();
} catch (error) {
console.error('[Sidebar] Failed to migrate legacy starred projects:', error);
} finally {
@@ -215,10 +223,6 @@ export function useSidebarController({
};
void migrateLegacyStars();
return () => {
active = false;
};
}, [onRefresh]);
useEffect(() => {
@@ -446,16 +450,26 @@ export function useSidebarController({
const getProjectSessions = useCallback((project: Project) => getAllSessions(project), []);
const loadMoreSessionsForProject = useCallback(async (projectId: string) => {
if (!onLoadMoreSessions || loadingMoreProjects.has(projectId)) {
if (!onLoadMoreSessions) {
return;
}
let shouldLoad = false;
setLoadingMoreProjects((previous) => {
if (previous.has(projectId)) {
return previous;
}
shouldLoad = true;
const next = new Set(previous);
next.add(projectId);
return next;
});
if (!shouldLoad) {
return;
}
try {
await onLoadMoreSessions(projectId);
} catch (error) {
@@ -468,7 +482,7 @@ export function useSidebarController({
return next;
});
}
}, [loadingMoreProjects, onLoadMoreSessions, t]);
}, [onLoadMoreSessions, t]);
const projectsWithResolvedStarState = useMemo(() => {
if (optimisticStarByProjectId.size === 0) {

View File

@@ -605,12 +605,28 @@ export function useProjectsState({
setProjects((prevProjects) =>
prevProjects.map((project) => {
const sessions = project.sessions?.filter((session) => session.id !== sessionIdToDelete) ?? [];
const cursorSessions = project.cursorSessions?.filter((session) => session.id !== sessionIdToDelete) ?? [];
const codexSessions = project.codexSessions?.filter((session) => session.id !== sessionIdToDelete) ?? [];
const geminiSessions = project.geminiSessions?.filter((session) => session.id !== sessionIdToDelete) ?? [];
const removedFromProject = (
sessions.length !== (project.sessions?.length ?? 0)
|| cursorSessions.length !== (project.cursorSessions?.length ?? 0)
|| codexSessions.length !== (project.codexSessions?.length ?? 0)
|| geminiSessions.length !== (project.geminiSessions?.length ?? 0)
);
if (!removedFromProject) {
return project;
}
const updatedProject: Project = {
...project,
sessions: project.sessions?.filter((session) => session.id !== sessionIdToDelete) ?? [],
cursorSessions: project.cursorSessions?.filter((session) => session.id !== sessionIdToDelete) ?? [],
codexSessions: project.codexSessions?.filter((session) => session.id !== sessionIdToDelete) ?? [],
geminiSessions: project.geminiSessions?.filter((session) => session.id !== sessionIdToDelete) ?? [],
sessions,
cursorSessions,
codexSessions,
geminiSessions,
};
const totalSessions = Math.max(0, Number(project.sessionMeta?.total ?? 0) - 1);