import type { SubmitErrorHandler, SubmitHandler } from "react-hook-form"; import { useEffect, useImperativeHandle, useRef } from "react"; import Link from "next/link"; import { ActionButton } from "@/components/ui/action-button"; import { Form, FormControl, FormItem } from "@/components/ui/form"; import InfoTooltip from "@/components/ui/info-tooltip"; import { Separator } from "@/components/ui/separator"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/use-toast"; import { useClientConfig } from "@/lib/clientConfig"; import { useBookmarkLayoutSwitch } from "@/lib/userLocalSettings/bookmarksLayout"; import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { ExternalLink } from "lucide-react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { useCreateBookmarkWithPostHook } from "@hoarder/shared-react/hooks/bookmarks"; function useFocusOnKeyPress(inputRef: React.RefObject) { useEffect(() => { function handleKeyPress(e: KeyboardEvent) { if (!inputRef.current) { return; } if ((e.metaKey || e.ctrlKey) && e.code === "KeyE") { inputRef.current.focus(); } } document.addEventListener("keydown", handleKeyPress); return () => { document.removeEventListener("keydown", handleKeyPress); }; }, [inputRef]); } export default function EditorCard({ className }: { className?: string }) { const inputRef = useRef(null); const demoMode = !!useClientConfig().demoMode; const formSchema = z.object({ text: z.string(), }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { text: "", }, }); const { ref, ...textFieldProps } = form.register("text"); useImperativeHandle(ref, () => inputRef.current); useFocusOnKeyPress(inputRef); const { mutate, isPending } = useCreateBookmarkWithPostHook({ onSuccess: (resp) => { if (resp.alreadyExists) { toast({ description: (
Bookmark already exists. Open
), variant: "default", }); } form.reset(); }, onError: () => { toast({ description: "Something went wrong", variant: "destructive" }); }, }); const onSubmit: SubmitHandler> = (data) => { const text = data.text.trim(); try { const url = new URL(text); if (url.protocol != "http:" && url.protocol != "https:") { throw new Error("Invalid URL"); } mutate({ type: "link", url: text }); } catch (e) { // Not a URL mutate({ type: "text", text }); } }; const onError: SubmitErrorHandler> = (errors) => { toast({ description: Object.values(errors) .map((v) => v.message) .join("\n"), variant: "destructive", }); }; const cardHeight = useBookmarkLayoutSwitch({ grid: "h-96", masonry: "h-96", list: undefined, }); return (

NEW ITEM

You can quickly focus on this field by pressing ⌘ + E