"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 (

{text}

{description}

{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")}

); }