diff options
| author | Mohamed Bassem <me@mbassem.com> | 2024-12-28 12:30:24 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2024-12-28 12:30:24 +0000 |
| commit | 7956e9fa6772ab57a0794fb7cba7e9d9c0bd7878 (patch) | |
| tree | 10d6e47afed8be007361cd40ec8b05fc52d6d4d9 /apps/web/components/dashboard/highlights/HighlightCard.tsx | |
| parent | 7dd5b2bc8751911f86448e6c4619b2583d9a4b53 (diff) | |
| download | karakeep-7956e9fa6772ab57a0794fb7cba7e9d9c0bd7878.tar.zst | |
feat: Implement the all highlights page. Fixes #620
Diffstat (limited to 'apps/web/components/dashboard/highlights/HighlightCard.tsx')
| -rw-r--r-- | apps/web/components/dashboard/highlights/HighlightCard.tsx | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/apps/web/components/dashboard/highlights/HighlightCard.tsx b/apps/web/components/dashboard/highlights/HighlightCard.tsx new file mode 100644 index 00000000..63ff9423 --- /dev/null +++ b/apps/web/components/dashboard/highlights/HighlightCard.tsx @@ -0,0 +1,76 @@ +import { ActionButton } from "@/components/ui/action-button"; +import { toast } from "@/components/ui/use-toast"; +import { cn } from "@/lib/utils"; +import { Trash2 } from "lucide-react"; + +import { useDeleteHighlight } from "@hoarder/shared-react/hooks/highlights"; +import { ZHighlight } from "@hoarder/shared/types/highlights"; + +import { HIGHLIGHT_COLOR_MAP } from "../preview/highlights"; + +export default function HighlightCard({ + highlight, + clickable, + className, +}: { + highlight: ZHighlight; + clickable: boolean; + className?: string; +}) { + const { mutate: deleteHighlight, isPending: isDeleting } = useDeleteHighlight( + { + onSuccess: () => { + toast({ + description: "Highlight has been deleted!", + }); + }, + onError: () => { + toast({ + description: "Something went wrong", + variant: "destructive", + }); + }, + }, + ); + + const onBookmarkClick = () => { + document + .querySelector(`[data-highlight-id="${highlight.id}"]`) + ?.scrollIntoView({ + behavior: "smooth", + block: "center", + }); + }; + + const Wrapper = ({ children }: { children: React.ReactNode }) => + clickable ? ( + <button onClick={onBookmarkClick}>{children}</button> + ) : ( + <div>{children}</div> + ); + + return ( + <div className={cn("flex items-center justify-between", className)}> + <Wrapper> + <blockquote + cite={highlight.bookmarkId} + className={cn( + "prose border-l-[6px] p-2 pl-6 italic dark:prose-invert prose-p:text-sm", + HIGHLIGHT_COLOR_MAP["border-l"][highlight.color], + )} + > + <p>{highlight.text}</p> + </blockquote> + </Wrapper> + <div className="flex gap-2"> + <ActionButton + loading={isDeleting} + variant="ghost" + onClick={() => deleteHighlight({ highlightId: highlight.id })} + > + <Trash2 className="size-4 text-destructive" /> + </ActionButton> + </div> + </div> + ); +} |
