"use client";
import { useCallback, useEffect, useState } from "react";
import { Button, buttonVariants } from "@/components/ui/button";
import FilePickerButton from "@/components/ui/file-picker-button";
import { Progress } from "@/components/ui/progress";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { useBookmarkImport } from "@/lib/hooks/useBookmarkImport";
import { useTranslation } from "@/lib/i18n/client";
import { cn } from "@/lib/utils";
import { useQuery, useQueryClient } from "@tanstack/react-query";
import { Download, Loader2, Upload } from "lucide-react";
import { Card, CardContent } from "../ui/card";
import { toast } from "../ui/use-toast";
import { ImportSessionsSection } from "./ImportSessionsSection";
function ImportCard({
text,
description,
children,
}: {
text: string;
description: string;
children: React.ReactNode;
}) {
return (
{children}
);
}
function ExportButton() {
const { t } = useTranslation();
const [format, setFormat] = useState<"json" | "netscape">("json");
const queryClient = useQueryClient();
const { isFetching, refetch, error } = useQuery({
queryKey: ["exportBookmarks"],
queryFn: async () => {
const res = await fetch(`/api/bookmarks/export?format=${format}`);
if (!res.ok) {
const error = await res.json();
throw new Error(error?.error || "Failed to export bookmarks");
}
const match = res.headers
.get("Content-Disposition")
?.match(/filename\*?=(?:UTF-8''|")?([^"]+)/i);
const filename = match
? match[1]
: `karakeep-export-${new Date().toISOString()}.${format}`;
return { blob: res.blob(), filename };
},
enabled: false,
});
useEffect(() => {
if (error) {
toast({
description: error.message,
variant: "destructive",
});
}
}, [error]);
const onExport = useCallback(async () => {
const { data } = await refetch();
if (!data) return;
const { blob, filename } = data;
const url = window.URL.createObjectURL(await blob);
const a = document.createElement("a");
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
queryClient.setQueryData(["exportBookmarks"], () => null);
}, [refetch]);
return (
Export File
{t("settings.import.export_links_and_notes")}
);
}
export function ImportExportRow() {
const { t } = useTranslation();
const { importProgress, runUploadBookmarkFile } = useBookmarkImport();
return (
runUploadBookmarkFile({ file, source: "html" })
}
>
Import
runUploadBookmarkFile({ file, source: "pocket" })
}
>
Import
runUploadBookmarkFile({ file, source: "omnivore" })
}
>
Import
runUploadBookmarkFile({ file, source: "linkwarden" })
}
>
Import
runUploadBookmarkFile({ file, source: "tab-session-manager" })
}
>
Import
runUploadBookmarkFile({ file, source: "mymind" })
}
>
Import
runUploadBookmarkFile({ file, source: "karakeep" })
}
>
Import
{importProgress && (
Processed {importProgress.done} of {importProgress.total} bookmarks
)}
);
}
export default function ImportExport() {
const { t } = useTranslation();
return (
{t("settings.import.import_export_bookmarks")}
);
}