import { ActivityIndicator, Alert, Pressable, View } from "react-native"; import * as Haptics from "expo-haptics"; import { useRouter } from "expo-router"; import { Text } from "@/components/ui/Text"; import { api } from "@/lib/trpc"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import { ExternalLink, Trash2 } from "lucide-react-native"; import type { ZHighlight } from "@karakeep/shared/types/highlights"; import { useDeleteHighlight } from "@karakeep/shared-react/hooks/highlights"; import { useToast } from "../ui/Toast"; dayjs.extend(relativeTime); // Color map for highlights (mapped to Tailwind CSS classes used in NativeWind) const HIGHLIGHT_COLOR_MAP = { red: "#fecaca", // bg-red-200 green: "#bbf7d0", // bg-green-200 blue: "#bfdbfe", // bg-blue-200 yellow: "#fef08a", // bg-yellow-200 } as const; export default function HighlightCard({ highlight, }: { highlight: ZHighlight; }) { const { toast } = useToast(); const router = useRouter(); const onError = () => { toast({ message: "Something went wrong", variant: "destructive", showProgress: false, }); }; const { mutate: deleteHighlight, isPending: isDeleting } = useDeleteHighlight( { onSuccess: () => { toast({ message: "Highlight has been deleted!", showProgress: false, }); }, onError, }, ); const deleteHighlightAlert = () => Alert.alert( "Delete highlight?", "Are you sure you want to delete this highlight?", [ { text: "Cancel", style: "cancel" }, { text: "Delete", onPress: () => deleteHighlight({ highlightId: highlight.id }), style: "destructive", }, ], ); const { data: bookmark } = api.bookmarks.getBookmark.useQuery( { bookmarkId: highlight.bookmarkId, }, { retry: false, }, ); const handleBookmarkPress = () => { Haptics.selectionAsync(); router.push(`/dashboard/bookmarks/${highlight.bookmarkId}`); }; return ( {/* Highlight text with colored border */} {highlight.text || "No text available"} {/* Note if present */} {highlight.note && ( Note: {highlight.note} )} {/* Footer with timestamp and actions */} {dayjs(highlight.createdAt).fromNow()} {bookmark && ( <> Source )} {isDeleting ? ( ) : ( { Haptics.selectionAsync(); deleteHighlightAlert(); }} > )} ); }