| | import API from "./api"; |
| | import { type AxiosResponse } from "axios"; |
| |
|
| | |
| | export interface Note { |
| | id: number; |
| | filename: string; |
| | created_at: string; |
| | } |
| |
|
| | export interface ChatMessage { |
| | role: "user" | "assistant"; |
| | content: string; |
| | } |
| |
|
| | export interface Session { |
| | id: string; |
| | name: string; |
| | created_at: string; |
| | pdf_id: number; |
| | } |
| |
|
| | |
| | export const fetchNotes = async (): Promise<Note[]> => { |
| | const response: AxiosResponse<Note[]> = await API.get("/notes/"); |
| | return response.data; |
| | }; |
| |
|
| | |
| | export const uploadNote = async (file: File): Promise<Note> => { |
| | const formData = new FormData(); |
| | formData.append("file", file); |
| |
|
| | const response = await API.post("/notes/upload_notes", formData, { |
| | headers: { |
| | "Content-Type": "multipart/form-data", |
| | }, |
| | }); |
| |
|
| | return { |
| | id: response.data.doc_id, |
| | filename: response.data.filename, |
| | created_at: new Date().toISOString(), |
| | }; |
| | }; |
| |
|
| | |
| | export const deleteNote = async (noteId: number) => { |
| | const response = await API.delete(`/notes/${noteId}`); |
| | return response.data; |
| | }; |
| |
|
| | |
| | export const renameNote = async (noteId: number, newName: string) => { |
| | const response = await API.put(`/notes/${noteId}`, { new_filename: newName }); |
| | return response.data; |
| | }; |
| |
|
| | |
| | export const getNoteContentUrl = (noteId: number): string => { |
| | return `/api/v1/notes/${noteId}/content`; |
| | }; |
| |
|
| | |
| | export const fetchNoteBlob = async (noteId: number): Promise<Blob> => { |
| | const response = await API.get(`/notes/${noteId}/content`, { |
| | responseType: "blob", |
| | }); |
| | return response.data; |
| | }; |
| |
|
| | |
| | export const createChatSession = async ( |
| | pdfId: number, |
| | name: string = "New Chat" |
| | ) => { |
| | const response = await API.post("/notes/sessions", { pdf_id: pdfId, name }); |
| | return response.data; |
| | }; |
| |
|
| | |
| | export const fetchChatHistory = async (sessionId: string) => { |
| | const response = await API.get(`/notes/history/${sessionId}`); |
| | return response.data; |
| | }; |
| |
|
| | export const fetchSessions = async (pdfId: number): Promise<Session[]> => { |
| | const response = await API.get(`/notes/sessions/${pdfId}`); |
| | return response.data; |
| | }; |
| |
|
| | |
| | export const streamChatRequest = async ( |
| | sessionId: string, |
| | userMessage: string, |
| | onChunk: (chunk: string) => void, |
| | onError: (err: any) => void |
| | ) => { |
| | const token = localStorage.getItem("token"); |
| |
|
| | try { |
| | const response = await fetch( |
| | `/api/v1/notes/chat/${sessionId}?user_prompt=${encodeURIComponent( |
| | userMessage |
| | )}`, |
| | { |
| | method: "POST", |
| | headers: { |
| | Authorization: `Bearer ${token}`, |
| | "Content-Type": "application/json", |
| | }, |
| | } |
| | ); |
| |
|
| | if (!response.body) throw new Error("No response body"); |
| |
|
| | const reader = response.body.getReader(); |
| | const decoder = new TextDecoder("utf-8"); |
| |
|
| | while (true) { |
| | const { done, value } = await reader.read(); |
| | if (done) break; |
| | const chunk = decoder.decode(value, { stream: true }); |
| | onChunk(chunk); |
| | } |
| | } catch (err) { |
| | onError(err); |
| | } |
| | }; |
| |
|