lib/app-tabs-api.ts
Rama main · réplica de lectura del repositorio original.
"use client";
import type { AppTab, AppTabPatch } from "./app-tabs";
import { fetchClientRead } from "./client-read";
export class AppTabRequestError extends Error {
constructor(public code: string, public tab?: AppTab) { super(code); }
}
async function request<T>(path: string, init?: RequestInit): Promise<T> {
const requestFetch = init?.method ? fetch : fetchClientRead;
const response = await requestFetch(`/api/me/app-tabs${path}`, { ...init, headers: { "Content-Type": "application/json" } });
const data = await response.json();
if (!response.ok) throw new AppTabRequestError(data.code ?? "database", data.tab);
return data as T;
}
export const fetchAppTabs = (signal?: AbortSignal) => request<AppTab[]>("", { signal });
export async function createAppTab(ensure: boolean, id = crypto.randomUUID(), signal?: AbortSignal): Promise<AppTab> {
return (await request<{ tab: AppTab }>("", { method: "POST", body: JSON.stringify({ ensure, id }), signal })).tab;
}
export async function patchAppTab(tab: AppTab, patch: AppTabPatch, signal?: AbortSignal): Promise<AppTab> {
return (await request<{ tab: AppTab }>(`/${tab.id}`, { method: "PATCH", body: JSON.stringify({ revision: tab.revision, patch }), signal })).tab;
}
export async function deleteAppTab(tab: AppTab, signal?: AbortSignal): Promise<void> {
await request(`/${tab.id}`, { method: "DELETE", body: JSON.stringify({ revision: tab.revision }), signal });
}
export async function moveAppTab(tab: AppTab, beforeId: string | null, signal?: AbortSignal): Promise<AppTab[]> {
return (await request<{ tabs: AppTab[] }>(`/${tab.id}/move`, {
method: "POST", body: JSON.stringify({ revision: tab.revision, beforeId }), signal,
})).tabs;
}