import { del, get } from "./api"; import { choiceDialog, confirmDialog, toast } from "./dialogs"; import { t } from "./i18n"; import { formatSize } from "./components/FileFigure"; interface FolderInfo { own: boolean; path?: string; files?: number; bytes?: number; git?: boolean; truncated?: boolean; } /** * Delete a chat after asking. A chat with a folder of its own (not shared with other chats, not a * project) gets the question whether the folder goes with it. Resolves to true when it was deleted. */ export async function deleteChat(session: { id: string; parent_id?: string | null }): Promise { const folder = session.parent_id ? undefined : await get(`/sessions/${session.id}/folder`).catch(() => undefined); let withFolder = false; if (folder?.own) { const size = `${folder.truncated ? "> " : ""}${t("chat.folderFiles", { n: folder.files ?? 0 })}, ${formatSize(folder.bytes ?? 0)}`; const choice = await choiceDialog({ title: t("chat.deleteTitle"), message: `${t("chat.deleteWithFolder", { path: folder.path ?? "", size })}${folder.git ? `\n\n${t("chat.folderHasGit")}` : ""}`, choices: [ { value: "chat", label: t("chat.deleteOnlyChat") }, { value: "both", label: t("chat.deleteChatAndFolder"), danger: true }, ], }); if (!choice) return false; withFolder = choice === "both"; } else if (!(await confirmDialog({ message: t("chat.deleteConfirm"), danger: true, confirmLabel: t("common.delete") }))) { return false; } try { const r = await del<{ folder_deleted?: boolean; folder_error?: string }>(`/sessions/${session.id}${withFolder ? "?delete_folder=true" : ""}`); if (r?.folder_error) toast(r.folder_error); else if (r?.folder_deleted) toast(t("chat.folderDeleted"), "success"); return true; } catch (e: any) { toast(e.message); return false; } }