satupeta-main/shared/utils/download-mapset.ts
2026-01-27 09:31:12 +07:00

137 lines
3.7 KiB
TypeScript

import { toast } from "sonner";
import { Mapset } from "../types/mapset";
import { apiHelpers } from "../services/api";
const API_URL = process.env.NEXT_PUBLIC_API_URL as string | undefined;
function logDownload(mapset: Mapset, format: "geojson" | "shp" | "kml") {
try {
if (!API_URL) return;
void apiHelpers.post(`${"/mapsets/" + mapset.id + "/download"}`, { format }).catch(() => {
// ignore errors
});
} catch {
// ignore
}
}
export const handleDownloadGeojson = async (mapset: Mapset) => {
if (!mapset?.layer_url) {
toast.error("URL layer tidak tersedia");
return;
}
try {
toast.loading("Mempersiapkan download...");
logDownload(mapset, "geojson");
const response = await fetch(`/fe-api/mapset/download/geojson/${mapset.id}`);
if (!response.ok) {
const error = await response.json();
throw new Error(error.message ?? "Gagal mengunduh data");
}
// Get the blob from the response
const blob = await response.blob();
// Create download link
const url = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = `${mapset.name}.geojson`;
document.body.appendChild(link);
link.click();
// Cleanup
window.URL.revokeObjectURL(url);
document.body.removeChild(link);
toast.success("Download GeoJSON dimulai");
} catch (error) {
console.error("Download error:", error);
toast.error(error instanceof Error ? error.message : "Gagal mengunduh data");
} finally {
toast.dismiss();
}
};
export const handleDownloadShp = async (mapset: Mapset) => {
if (!mapset?.layer_url) {
toast.error("URL layer tidak tersedia");
return;
}
try {
toast.loading("Mempersiapkan download...");
logDownload(mapset, "shp");
const response = await fetch(`/fe-api/mapset/download/shp/${mapset.id}`);
if (!response.ok) {
const error = await response.json();
throw new Error(error.message ?? "Gagal mengunduh data");
}
// Get the blob from the response
const blob = await response.blob();
// Create download link
const url = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = `${mapset.name}.zip`;
document.body.appendChild(link);
link.click();
// Cleanup
window.URL.revokeObjectURL(url);
document.body.removeChild(link);
toast.success("Download GeoJSON dimulai");
} catch (error) {
console.error("Download error:", error);
toast.error(error instanceof Error ? error.message : "Gagal mengunduh data");
} finally {
toast.dismiss();
}
};
export const handleDownloadKml = async (mapset: Mapset) => {
if (!mapset?.layer_url) {
toast.error("URL layer tidak tersedia");
return;
}
try {
toast.loading("Mempersiapkan download...");
logDownload(mapset, "kml");
const response = await fetch(`/fe-api/mapset/download/kml/${mapset.id}`);
if (!response.ok) {
const error = await response.json();
throw new Error(error.message ?? "Gagal mengunduh data");
}
// Get the blob from the response
const blob = await response.blob();
// Create download link
const url = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = `${mapset.name}.kml`;
document.body.appendChild(link);
link.click();
// Cleanup
window.URL.revokeObjectURL(url);
document.body.removeChild(link);
toast.success("Download GeoJSON dimulai");
} catch (error) {
console.error("Download error:", error);
toast.error(error instanceof Error ? error.message : "Gagal mengunduh data");
} finally {
toast.dismiss();
}
};