From f6ca0b0c4fb3c1e6d93a00fcce7cb0aee12930c0 Mon Sep 17 00:00:00 2001 From: MohamedBassem Date: Sat, 16 Mar 2024 00:34:04 +0000 Subject: ui(web): Add an editor card inline in the bookmark grid and remove the top nav buttons --- apps/web/app/dashboard/bookmarks/page.tsx | 2 +- .../dashboard/bookmarks/AddLinkButton.tsx | 103 --------------------- .../components/dashboard/bookmarks/Bookmarks.tsx | 13 ++- .../dashboard/bookmarks/BookmarksGrid.tsx | 25 +++-- .../components/dashboard/bookmarks/EditorCard.tsx | 91 ++++++++++++++++++ apps/web/components/dashboard/bookmarks/TopNav.tsx | 37 +------- .../components/dashboard/search/SearchInput.tsx | 2 + 7 files changed, 123 insertions(+), 150 deletions(-) delete mode 100644 apps/web/components/dashboard/bookmarks/AddLinkButton.tsx create mode 100644 apps/web/components/dashboard/bookmarks/EditorCard.tsx (limited to 'apps') diff --git a/apps/web/app/dashboard/bookmarks/page.tsx b/apps/web/app/dashboard/bookmarks/page.tsx index c9391d85..e310df01 100644 --- a/apps/web/app/dashboard/bookmarks/page.tsx +++ b/apps/web/app/dashboard/bookmarks/page.tsx @@ -1,5 +1,5 @@ import Bookmarks from "@/components/dashboard/bookmarks/Bookmarks"; export default async function BookmarksPage() { - return ; + return ; } diff --git a/apps/web/components/dashboard/bookmarks/AddLinkButton.tsx b/apps/web/components/dashboard/bookmarks/AddLinkButton.tsx deleted file mode 100644 index 45a67020..00000000 --- a/apps/web/components/dashboard/bookmarks/AddLinkButton.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import type { SubmitErrorHandler } from "react-hook-form"; -import { useState } from "react"; -import { ActionButton } from "@/components/ui/action-button"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogClose, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { Form, FormControl, FormField, FormItem } from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; -import { toast } from "@/components/ui/use-toast"; -import { api } from "@/lib/trpc"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; - -export function AddLinkButton({ children }: { children: React.ReactNode }) { - const [isOpen, setOpen] = useState(false); - - const formSchema = z.object({ - url: z.string().url({ message: "The link must be a valid URL" }), - }); - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: { - url: "", - }, - }); - - const invalidateBookmarksCache = api.useUtils().bookmarks.invalidate; - const createBookmarkMutator = api.bookmarks.createBookmark.useMutation({ - onSuccess: () => { - invalidateBookmarksCache(); - form.reset(); - setOpen(false); - }, - onError: () => { - toast({ description: "Something went wrong", variant: "destructive" }); - }, - }); - - const onError: SubmitErrorHandler> = (errors) => { - toast({ - description: Object.values(errors) - .map((v) => v.message) - .join("\n"), - variant: "destructive", - }); - }; - - return ( - - {children} - -
- - Add Link - - - createBookmarkMutator.mutate({ url: value.url, type: "link" }), - onError, - )} - > - { - return ( - - - - - - ); - }} - /> - - - - - - Add - - - - -
-
- ); -} diff --git a/apps/web/components/dashboard/bookmarks/Bookmarks.tsx b/apps/web/components/dashboard/bookmarks/Bookmarks.tsx index 9f001551..601b1627 100644 --- a/apps/web/components/dashboard/bookmarks/Bookmarks.tsx +++ b/apps/web/components/dashboard/bookmarks/Bookmarks.tsx @@ -11,7 +11,12 @@ export default async function Bookmarks({ archived, title, showDivider, -}: ZGetBookmarksRequest & { title: string; showDivider?: boolean }) { + showEditorCard = false, +}: ZGetBookmarksRequest & { + title: string; + showDivider?: boolean; + showEditorCard?: boolean; +}) { const session = await getServerAuthSession(); if (!session) { redirect("/"); @@ -28,7 +33,11 @@ export default async function Bookmarks({
{title}
{showDivider &&
} - +
); } diff --git a/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx b/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx index 185e318e..644991bb 100644 --- a/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx +++ b/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx @@ -12,9 +12,18 @@ import type { ZGetBookmarksRequest, } from "@hoarder/trpc/types/bookmarks"; +import EditorCard from "./EditorCard"; import LinkCard from "./LinkCard"; import TextCard from "./TextCard"; +function BookmarkCard({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} + function getBreakpointConfig() { const fullConfig = resolveConfig(tailwindConfig); @@ -37,22 +46,17 @@ function renderBookmark(bookmark: ZBookmark) { comp = ; break; } - return ( - - {comp} - - ); + return {comp}; } export default function BookmarksGrid({ query, bookmarks: initialBookmarks, + showEditorCard = false, }: { query: ZGetBookmarksRequest; bookmarks: ZBookmark[]; + showEditorCard?: boolean; }) { const { data } = api.bookmarks.getBookmarks.useQuery(query, { initialData: { bookmarks: initialBookmarks }, @@ -63,6 +67,11 @@ export default function BookmarksGrid({ } return ( + {showEditorCard && ( + + + + )} {data.bookmarks.map((b) => renderBookmark(b))} ); diff --git a/apps/web/components/dashboard/bookmarks/EditorCard.tsx b/apps/web/components/dashboard/bookmarks/EditorCard.tsx new file mode 100644 index 00000000..28e8f41f --- /dev/null +++ b/apps/web/components/dashboard/bookmarks/EditorCard.tsx @@ -0,0 +1,91 @@ +import type { SubmitErrorHandler, SubmitHandler } from "react-hook-form"; +import { ActionButton } from "@/components/ui/action-button"; +import { Form, FormControl, FormField, FormItem } from "@/components/ui/form"; +import { Textarea } from "@/components/ui/textarea"; +import { toast } from "@/components/ui/use-toast"; +import { api } from "@/lib/trpc"; +import { cn } from "@/lib/utils"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +export default function EditorCard({ className }: { className?: string }) { + const formSchema = z.object({ + text: z.string(), + }); + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + text: "", + }, + }); + + const invalidateBookmarksCache = api.useUtils().bookmarks.invalidate; + const { mutate, isPending } = api.bookmarks.createBookmark.useMutation({ + onSuccess: () => { + invalidateBookmarksCache(); + form.reset(); + }, + onError: () => { + toast({ description: "Something went wrong", variant: "destructive" }); + }, + }); + + const onSubmit: SubmitHandler> = (data) => { + const text = data.text.trim(); + try { + new URL(text); + 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", + }); + }; + + return ( +
+ + { + return ( + + +