mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-24 11:15:48 +08:00
The sidebar had to understand cursorSessions, codexSessions, and other provider buckets because /api/projects exposed provider-shaped arrays. That leaked backend adapter storage into project state and made frontend behavior drift each time a provider needed another bucket or exception. Return one sessions list with provider metadata instead. Project state, search, and running-session filtering now share one contract, while provider-specific storage remains behind the backend boundary.
36 lines
1.0 KiB
TypeScript
36 lines
1.0 KiB
TypeScript
import { authenticatedFetch } from '../../../utils/api';
|
|
import type { LLMProvider, ProjectSession } from '../../../types/app';
|
|
|
|
import { useApiSource } from './useApiSource';
|
|
|
|
export type SessionResult = {
|
|
id: string;
|
|
label: string;
|
|
provider?: LLMProvider;
|
|
};
|
|
|
|
interface SessionsResponse {
|
|
sessions?: ProjectSession[];
|
|
}
|
|
|
|
export function useSessionsSource(projectId: string | undefined, enabled: boolean) {
|
|
return useApiSource<SessionResult, SessionsResponse>({
|
|
enabled: enabled && !!projectId,
|
|
deps: [projectId],
|
|
fetcher: (signal) => {
|
|
const params = new URLSearchParams({ limit: '50', offset: '0' });
|
|
return authenticatedFetch(
|
|
`/api/projects/${encodeURIComponent(projectId!)}/sessions?${params.toString()}`,
|
|
{ signal },
|
|
);
|
|
},
|
|
parse: (data) => {
|
|
return (data.sessions ?? []).map<SessionResult>((s) => ({
|
|
id: s.id,
|
|
label: (s.title || s.summary || s.name || s.id) as string,
|
|
provider: (s.__provider || s.provider) as LLMProvider | undefined,
|
|
}));
|
|
},
|
|
});
|
|
}
|