learning_ai_notes/web/src/lib/saved-views-client.ts
saravanakumardb1 c2202e9e52 refactor(web): extract shared API client factory, fix types, use crypto.randomUUID
- Created api-helpers.ts with shared getAccessToken() + createNotesApiClient()
- Removed duplicate API client factory from notes-client.ts, review-client.ts,
  saved-views-client.ts (3 copies → 1 shared module)
- Added reviewedBy/reviewedAt/reviewNote fields to review-client NoteAgentActionDoc
  type to match backend response shape
- Search page: use crypto.randomUUID() for saved view IDs instead of Date.now()
  to prevent collisions on rapid saves

Verification: web typecheck + 6/6 tests pass.
2026-03-10 19:53:45 -07:00

66 lines
1.8 KiB
TypeScript

"use client";
import { createNotesApiClient } from "@/lib/api-helpers";
export interface SavedView {
id: string;
name: string;
scope: "workspace" | "search" | "review";
description?: string;
query: string;
filters?: Record<string, string>;
sortOrder: number;
createdAt: string;
updatedAt: string;
}
interface SavedViewListResponse {
items: SavedView[];
total: number;
}
export async function listSavedViews(scope?: SavedView["scope"]): Promise<SavedView[]> {
const api = createNotesApiClient();
const params = new URLSearchParams();
if (scope) params.set("scope", scope);
const response = await api.fetch<SavedViewListResponse>(`/saved-views?${params.toString()}`);
return response.items;
}
export async function getSavedView(id: string): Promise<SavedView> {
const api = createNotesApiClient();
return api.fetch<SavedView>(`/saved-views/${encodeURIComponent(id)}`);
}
export async function createSavedView(input: {
id: string;
name: string;
scope: SavedView["scope"];
description?: string;
query: string;
filters?: Record<string, string>;
sortOrder?: number;
}): Promise<SavedView> {
const api = createNotesApiClient();
return api.fetch<SavedView>("/saved-views", {
method: "POST",
body: JSON.stringify(input),
});
}
export async function updateSavedView(
id: string,
updates: Partial<Pick<SavedView, "name" | "description" | "query" | "filters" | "sortOrder">>,
): Promise<SavedView> {
const api = createNotesApiClient();
return api.fetch<SavedView>(`/saved-views/${encodeURIComponent(id)}`, {
method: "PATCH",
body: JSON.stringify(updates),
});
}
export async function deleteSavedView(id: string): Promise<void> {
const api = createNotesApiClient();
await api.fetch(`/saved-views/${encodeURIComponent(id)}`, { method: "DELETE" });
}