kv-clearnup/src/api/client.ts
2026-02-02 08:33:46 +07:00

207 lines
5.5 KiB
TypeScript

const API_BASE = "http://localhost:36969/api";
export interface ScanResult {
path: string;
size: number;
isDirectory: boolean;
}
export interface DiskUsage {
name: string;
totalGB: string;
usedGB: string;
freeGB: string;
}
export interface CategorySizes {
documents: number;
downloads: number;
desktop: number;
music: number;
movies: number;
system: number;
trash: number;
apps: number;
photos: number;
icloud: number;
archives?: number;
virtual_machines?: number;
games?: number;
ai?: number;
docker?: number;
cache?: number;
}
export interface SystemInfo {
model: string;
chip: string;
memory: string;
os: string;
}
export interface CleaningEstimates {
flash_est: number;
deep_est: number;
}
// Uninstaller Types
export interface AppInfo {
name: string;
path: string;
bundleID: string;
uninstallString?: string;
size: number;
icon?: string;
}
export interface AssociatedFile {
path: string;
type: 'cache' | 'config' | 'log' | 'data' | 'registry';
size: number;
}
export interface AppDetails extends AppInfo {
associated: AssociatedFile[];
totalSize: number;
}
export const API = {
getDiskUsage: async (): Promise<DiskUsage[] | null> => {
try {
const res = await fetch(`${API_BASE}/disk-usage`);
if (!res.ok) throw new Error("Failed to fetch disk usage");
return await res.json();
} catch (e) {
console.error(e);
return null;
}
},
scanCategory: async (category: string): Promise<ScanResult[]> => {
const res = await fetch(`${API_BASE}/scan/category`, {
method: "POST",
body: JSON.stringify({ category })
});
return await res.json() || [];
},
openSettings: async () => {
await fetch(`${API_BASE}/open-settings`, { method: "POST" });
},
getCategorySizes: async (): Promise<CategorySizes> => {
try {
const res = await fetch(`${API_BASE}/scan/sizes?t=${Date.now()}`);
return await res.json();
} catch {
return { documents: 0, downloads: 0, desktop: 0, music: 0, movies: 0, system: 0, trash: 0, apps: 0, photos: 0, icloud: 0 };
}
},
deepestScan: async (): Promise<ScanResult[]> => {
const res = await fetch(`${API_BASE}/scan/deepest`, { method: "POST" });
return await res.json() || [];
},
purgePath: async (path: string): Promise<boolean> => {
try {
const res = await fetch(`${API_BASE}/purge`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ path }),
});
return res.ok;
} catch (e) {
console.error(e);
return false;
}
},
emptyTrash: async (): Promise<boolean> => {
try {
const res = await fetch(`${API_BASE}/empty-trash`, { method: "POST" });
return res.ok;
} catch (e) {
console.error(e);
return false;
}
},
clearCache: async (): Promise<{ cleared: number }> => {
try {
const res = await fetch(`${API_BASE}/clear-cache`, { method: "POST" });
return await res.json();
} catch (e) {
console.error(e);
return { cleared: 0 };
}
},
cleanDocker: async (): Promise<{ cleared: number; message: string }> => {
try {
const res = await fetch(`${API_BASE}/clean-docker`, { method: "POST" });
return await res.json();
} catch (e) {
console.error(e);
return { cleared: 0, message: "Docker cleanup failed" };
}
},
getSystemInfo: async (): Promise<SystemInfo | null> => {
try {
const res = await fetch(`${API_BASE}/system-info`);
return await res.json();
} catch (e) {
console.error(e);
return null;
}
},
getEstimates: async (): Promise<CleaningEstimates | null> => {
try {
const res = await fetch(`${API_BASE}/estimates`);
return await res.json();
} catch (e) {
console.error(e);
return null;
}
},
// Uninstaller APIs
getApps: async (): Promise<AppInfo[]> => {
const res = await fetch(`${API_BASE}/apps`);
return res.json();
},
getAppDetails: async (path: string, bundleID?: string): Promise<AppDetails> => {
const res = await fetch(`${API_BASE}/apps/details`, {
method: 'POST',
body: JSON.stringify({ path, bundleID }),
});
return res.json();
},
deleteAppFiles: async (files: string[]): Promise<void> => {
const res = await fetch(`${API_BASE}/apps/action`, {
method: 'POST',
body: JSON.stringify({ files }),
});
if (!res.ok) throw new Error("Failed to delete files");
},
uninstallApp: async (cmd: string): Promise<void> => {
const res = await fetch(`${API_BASE}/apps/uninstall`, {
method: 'POST',
body: JSON.stringify({ cmd }),
});
if (!res.ok) throw new Error("Failed to launch uninstaller");
},
getAppIcon: async (path: string): Promise<string> => {
// Fallback or use Electron bridge directly
if (window.electronAPI?.getAppIcon) {
return window.electronAPI.getAppIcon(path);
}
return '';
}
};