feat: add AI deadline extraction frontend page (Phase 2M)
- ExtractionForm: PDF dropzone (react-dropzone) + text textarea + case selector - ExtractionResults: review table with edit/remove per row, confidence color-coding - Page at /ai/extract: upload -> analyze -> review -> adopt deadlines to case - Extended API client with postFormData for multipart uploads - Added ExtractedDeadline and ExtractionResponse types
This commit is contained in:
@@ -72,6 +72,41 @@ class ApiClient {
|
||||
delete<T>(path: string) {
|
||||
return this.request<T>(path, { method: "DELETE" });
|
||||
}
|
||||
|
||||
async postFormData<T>(path: string, formData: FormData): Promise<T> {
|
||||
const supabase = createClient();
|
||||
const {
|
||||
data: { session },
|
||||
} = await supabase.auth.getSession();
|
||||
|
||||
const headers: HeadersInit = {};
|
||||
if (session?.access_token) {
|
||||
headers["Authorization"] = `Bearer ${session.access_token}`;
|
||||
}
|
||||
const tenantId = typeof window !== "undefined"
|
||||
? localStorage.getItem("kanzlai_tenant_id")
|
||||
: null;
|
||||
if (tenantId) {
|
||||
headers["X-Tenant-ID"] = tenantId;
|
||||
}
|
||||
|
||||
const res = await fetch(`${this.baseUrl}${path}`, {
|
||||
method: "POST",
|
||||
headers,
|
||||
body: formData,
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
const body = await res.json().catch(() => ({}));
|
||||
const err: ApiError = {
|
||||
error: body.error || res.statusText,
|
||||
status: res.status,
|
||||
};
|
||||
throw err;
|
||||
}
|
||||
|
||||
return res.json();
|
||||
}
|
||||
}
|
||||
|
||||
export const api = new ApiClient();
|
||||
|
||||
Reference in New Issue
Block a user